最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP Laravel 使用Swagger生成API文檔(基本概念和環(huán)境搭建)

 更新時(shí)間:2023年09月20日 11:37:20   作者:該葉無(wú)法找到  
Swagger是一種簡(jiǎn)單、強(qiáng)大的RESTful API表現(xiàn)形式,這篇文章主要介紹了PHP Laravel 使用Swagger生成API文檔(基本概念和環(huán)境搭建),需要的朋友可以參考下

PHPer中,很多人聽(tīng)說(shuō)過(guò)Swagger,部分人知道Swagger是用來(lái)做API文檔的,然而只有少數(shù)人真正知道怎么正確使用Swagger,因?yàn)?code>PHP界和Swagger相關(guān)的資料實(shí)在是太少了。所以鄙人斗膽一試,希望能以本文幫助到大家了解Swagger,從此告別成天用Word、Markdown折騰API文檔的日子。

什么是Swagger

Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability.

Swagger是一種簡(jiǎn)單、強(qiáng)大的RESTful API表現(xiàn)形式。
其擁有地球上最大的API工具生態(tài)環(huán)境,無(wú)數(shù)程序員在幾乎所有主流語(yǔ)言和開(kāi)發(fā)環(huán)境中添加了對(duì)Swagger的支持。
只要你的API添加對(duì)Swagger的支持,你就等于擁有了可交互的API文檔,SDK代碼生成以及外部使用友好的API。

  • Swagger.io首頁(yè)

寫了這么一堆貌似很屌的話,所以……Swagger到底是個(gè)啥?是一套代碼還是一個(gè)軟件呢?

其實(shí)和官網(wǎng)高度概括的描述一樣,Swagger是一種通用的、和編程語(yǔ)言無(wú)關(guān)的API的描述規(guī)范。只要開(kāi)發(fā)者在自己的API之上添加符合Swagger規(guī)范的描述,就能利用上Swagger豐富的生態(tài),找到符合自己開(kāi)發(fā)語(yǔ)言的工具去做很多事:比如最常用的生成API文檔,或者生成返回假數(shù)據(jù)的服務(wù)端基礎(chǔ)代碼等等。

人類的文字便是一種規(guī)范,人理解了文字的規(guī)范就可以進(jìn)行閱讀,機(jī)器按照規(guī)范也可以進(jìn)行文字識(shí)別,武林秘籍可以寫成文字讓所有人練習(xí),人的思想也可以寫成文字進(jìn)行傳播。人類的很多經(jīng)典書籍都被翻譯成了多國(guó)文字,Swagger的描述同樣也支持用YAML、XMLJSON來(lái)表示,含義都是一致的。Swagger UI通過(guò)任意一種形式的Swagger描述信息就能渲染出酷炫的API文檔,服務(wù)端接口代碼生成工具也能通過(guò)這個(gè)描述信息生成Controller代碼,圍繞著Swagger,一個(gè)強(qiáng)大的API生態(tài)環(huán)境就出現(xiàn)了。

那么就是說(shuō),以前我用Markdown寫文檔,現(xiàn)在我用YAML/XML/JSON寫文檔就行了?

是的,但Swagger功能不止如此。使用Swagger可以分為兩種情況:

  • 項(xiàng)目未開(kāi)始,需要先定義好API使前端和后端能夠同時(shí)開(kāi)發(fā);

  • API已完成,需要提供文檔;

第二種情況,我們確實(shí)可以直接開(kāi)始編寫一個(gè)JSON或者YAML文件來(lái)描述現(xiàn)有的API(使用Swagger-Editor),不過(guò)這里我們主要介紹第一種情況,全方位感受Swagger。

繼續(xù)之前,我們先介紹一下另一個(gè)東西(也許這么多新概念就是把大家弄暈了的原因……找到Swaager的應(yīng)用最佳實(shí)踐需要一點(diǎn)點(diǎn)時(shí)間,請(qǐng)繼續(xù)看)。

Annotation

AnnotationJava引入的一個(gè)概念,簡(jiǎn)單來(lái)說(shuō)就是用來(lái)給對(duì)應(yīng)的源代碼添加額外的元數(shù)據(jù)(關(guān)于數(shù)據(jù)的更詳細(xì)的數(shù)據(jù))的一種語(yǔ)法。Annotation本身不影響代碼的執(zhí)行,只能通過(guò)額外的工具解析或執(zhí)行,通常用來(lái)提供代碼檢查、數(shù)據(jù)類型標(biāo)注等功能。由于Annotation的強(qiáng)大,很多編程語(yǔ)言都引入了這個(gè)概念,包括PHP。

那么,如果我們能將Swagger的描述用Annotation的方式直接寫在Controller上,豈不是既方便又好維護(hù)?

結(jié)合Swagger和PHP

PHP中使用Swagger,我們需要一個(gè)工具去編寫和解析AnnotationSwagger的描述(例如JSON形式),Swagger豐富的生態(tài)不是吹的,這里我們直接使用前人寫好的swagger-php。而編寫API我們則使用Laravel框架(5.1)。當(dāng)然,swagger-php本身和用哪種框架開(kāi)發(fā)是沒(méi)關(guān)系的。

首先在Laravel項(xiàng)目中安裝swagger-php

$ composer require zircote/swagger-php

接著定義一個(gè)Controller用來(lái)測(cè)試:

$ artisan make:controller SwaggerController --plain

Controller中加上兩個(gè)方法:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class SwaggerController extends Controller
{
    /**
     * 返回JSON格式的Swagger定義
     */
    public function getJSON()
    {
    }
    /**
     * 假設(shè)是項(xiàng)目中的一個(gè)API
     */
    public function getMyData()
    {
    }
}

相應(yīng)的,我們?cè)黾勇酚膳渲茫?/p>

<?php
Route::group(['prefix' => 'swagger'], function () {
    Route::get('json', 'SwaggerController@getJSON');
    Route::get('my-data', 'SwaggerController@getMyData');
});

我們先實(shí)現(xiàn)getJSON方法,使其能夠返回合法的Swagger定義:

<?php
// ...
    /**
     * 返回JSON格式的Swagger定義
     *
     * 這里需要一個(gè)主`Swagger`定義:
     * @SWG\Swagger(
     *   @SWG\Info(
     *     title="我的`Swagger`API文檔",
     *     version="1.0.0"
     *   )
     * )
     */
    public function getJSON()
    {
        // 你可以將API的`Swagger Annotation`寫在實(shí)現(xiàn)API的代碼旁,從而方便維護(hù),
        // `swagger-php`會(huì)掃描你定義的目錄,自動(dòng)合并所有定義。這里我們直接用`Controller/`
        // 文件夾。
        $swagger = \Swagger\scan(app_path('Http/Controllers/'));
        return response()->json($swagger, 200);
    }
// ...

訪問(wèn)一下/swagger/json,如果我們看到下面的返回就說(shuō)明搭建成功了:

{"swagger":"2.0","info":{"title":"\u6211\u7684`Swagger`API\u6587\u6863","version":"1.0.0"},"paths":{},"definitions":{}}

然后我們來(lái)定義項(xiàng)目中的API接口:

<?php 
// ...
    /**
     * 假設(shè)是項(xiàng)目中的一個(gè)API
     *
     * @SWG\Get(path="/swagger/my-data",
     *   tags={"project"},
     *   summary="拿一些神秘的數(shù)據(jù)",
     *   description="請(qǐng)求該接口需要先登錄。",
     *   operationId="getMyData",
     *   produces={"application/json"},
     *   @SWG\Parameter(
     *     in="query",
     *     name="reason",
     *     type="string",
     *     description="拿數(shù)據(jù)的理由",
     *     required=true,
     *   ),
     *   @SWG\Response(response="default", description="操作成功")
     * )
     */
    public function getMyData()
    {
        //todo 待實(shí)現(xiàn)
    }
// ...

雖然API還沒(méi)有真正實(shí)現(xiàn),但是我們的第一個(gè)API文檔已經(jīng)完成了(后面我們?cè)谥v每個(gè)Annotation的含義)!來(lái)看看現(xiàn)在JSON接口的輸出內(nèi)容:

{"swagger":"2.0","info":{"title":"\u6211\u7684`Swagger`API\u6587\u6863","version":"1.0.0"},"paths":{"\/swagger\/my-data":{"get":{"tags":["project"],"summary":"\u62ff\u4e00\u4e9b\u795e\u79d8\u7684\u6570\u636e","description":"\u8bf7\u6c42\u8be5\u63a5\u53e3\u9700\u8981\u5148\u767b\u5f55\u3002","operationId":"getMyData","produces":["application\/xml","application\/json"],"parameters":[{"name":"reason","in":"query","description":"\u62ff\u6570\u636e\u7684\u7406\u7531","required":true,"type":"string"}],"responses":{"default":{"description":"\u64cd\u4f5c\u6210\u529f"}}}}},"definitions":{}}

Swagger-UI

當(dāng)然,如果直接把這個(gè)甩給前端同學(xué),他們一定會(huì)一臉懵逼看著你的……為了把JSON定義轉(zhuǎn)化為可以閱讀和交互的API,我們還需要用到Swagger-UI。Swagger-UI是一套不依賴后端的純HTML程序,只需要將之前輸出JSON的接口地址給它,就能得到一個(gè)強(qiáng)大的API文檔了。為了避免請(qǐng)求跨域問(wèn)題,我們將Swagger-UI部署在項(xiàng)目的public/swagger-ui/文件夾中。安裝非常簡(jiǎn)單,直接在GitHub上下載壓縮包,解壓縮之后將dist/文件夾下的所有內(nèi)容放到public/swagger-ui/就行了。

在訪問(wèn)之前,我們先改一下Swagger-UI默認(rèn)請(qǐng)求的接口地址,打開(kāi)public/swagger-ui/index.html,找到以下代碼:

<script type="text/javascript">
    $(function () {
        var url = window.location.search.match(/url=([^&]+)/);
        if (url && url.length > 1) {
          url = decodeURIComponent(url[1]);
        } else {
          url = "http://petstore.swagger.io/v2/swagger.json"; // 就是這一行
        }
// ...

url改成我們自己接口的地址,例如http://my.project/swagger/json。打開(kāi)瀏覽器,訪問(wèn)/swagger-ui/,就能看到API文檔了:

高大上的界面

在這個(gè)高大上的API文檔上稍微玩一會(huì)兒,你可能冒出幾個(gè)問(wèn)題:

  • 有沒(méi)有中文支持?

  • 每次都要點(diǎn)一次才能展開(kāi)API列表好麻煩,能默認(rèn)展開(kāi)嗎?

  • 右下角那個(gè)ERROR是什么意思?

可能你還有更多問(wèn)題,但我們先說(shuō)這三個(gè)吧…

設(shè)置中文

Swagger-UI支持多國(guó)語(yǔ)言,還是打開(kāi)swagger-ui/index.html,大約在30行左右:

// ...
    <!-- Some basic translations -->
    <!--<script src='lang/translator.js' type='text/javascript'></script>-->
    <!--<script src='lang/ru.js' type='text/javascript'></script>-->
    <!-- <script src='lang/en.js' type='text/javascript'></script> -->
// ...

我們改為:

// ...
    <!-- Some basic translations -->
    <script src='lang/translator.js' type='text/javascript'></script>
    <script src='lang/zh-cn.js' type='text/javascript'></script>
// ...

這樣就會(huì)變成中文了:

親切的中文界面

API列表默認(rèn)展開(kāi)

大概在swagger-ui/index.html的74行左右有以下代碼:

// ...
    onFailure: function(data) {
      log("Unable to Load SwaggerUI");
    },
    docExpansion: "none", // 這一行就是用來(lái)設(shè)置文檔默認(rèn)展開(kāi)層級(jí)的
    jsonEditor: false,
// ...

這個(gè)配置有三個(gè)值:

  • none 折疊所有內(nèi)容

  • list 展開(kāi)所有分組的API列表

  • full 展開(kāi)所有分組的API列表以及每個(gè)API的請(qǐng)求細(xì)節(jié)

一般來(lái)說(shuō)設(shè)置為list就可以了。

去掉ERROR提示

Swagger-UI默認(rèn)會(huì)將你的接口JSON傳給swagger.io進(jìn)行格式驗(yàn)證,然后對(duì)于我們已經(jīng)使用了swagger-php的項(xiàng)目來(lái)說(shuō)基本不需要(因?yàn)閷戝e(cuò)了Annotation的話會(huì)造成Swagger JSON接口報(bào)錯(cuò)),而且內(nèi)部項(xiàng)目有時(shí)也不方便暴露,所以我們可以關(guān)閉驗(yàn)證功能來(lái)去除右下角的ERROR提示圖標(biāo)。這個(gè)配置并不存在于swagger-ui/index.html中,我們需要手動(dòng)在Swagger UI聲明時(shí)設(shè)置一個(gè)新參數(shù):

// ...
    window.swaggerUi = new SwaggerUi({
        // ...
        validatorUrl: null, //添加這個(gè)配置
    });
// ...

再次刷新之后驗(yàn)證提示就徹底消失了。

如果你需要這個(gè)驗(yàn)證提示,但又不想使用swagger.io的公用服務(wù),你也可以自己搭建一個(gè),點(diǎn)這里查看Swagger Validator Badge的使用方法。

折騰成果

折騰后的成果

自定義Swagger UI

Swagger UI本身提供了很多配置和參數(shù)供用戶自定義,點(diǎn)這里查看,大家可以隨意發(fā)揮。

到此這篇關(guān)于PHP Laravel 使用Swagger生成API文檔(基本概念和環(huán)境搭建)的文章就介紹到這了,更多相關(guān)PHP Laravel 生成API文檔內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php二維碼生成以及下載實(shí)現(xiàn)

    php二維碼生成以及下載實(shí)現(xiàn)

    這篇文章主要介紹了php二維碼生產(chǎn)以及下載實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • php連接mssql數(shù)據(jù)庫(kù)的幾種方法

    php連接mssql數(shù)據(jù)庫(kù)的幾種方法

    數(shù)據(jù)庫(kù)查詢不外乎4個(gè)步驟,1、建立連接。2、輸入查詢代碼。3、建立查詢并取出數(shù)據(jù)。4、關(guān)閉連接。 php連接mssql數(shù)據(jù)庫(kù)有幾個(gè)注意事項(xiàng),尤其mssql的多個(gè)版本、32位、64位都有區(qū)別。
    2013-02-02
  • Phpstorm+Xdebug斷點(diǎn)調(diào)試PHP的方法

    Phpstorm+Xdebug斷點(diǎn)調(diào)試PHP的方法

    這篇文章主要介紹了Phpstorm+Xdebug斷點(diǎn)調(diào)試PHP的方法,本教程將通過(guò)配置Xdebug擴(kuò)展進(jìn)行斷點(diǎn)調(diào)試,目的在于提高大家的開(kāi)發(fā)效率,感興趣的小伙伴們可以參考一下
    2018-05-05
  • laravel 出現(xiàn)command not found問(wèn)題的解決方案

    laravel 出現(xiàn)command not found問(wèn)題的解決方案

    今天小編就為大家分享一篇laravel 出現(xiàn)command not found問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • PHP處理會(huì)話函數(shù)大總結(jié)

    PHP處理會(huì)話函數(shù)大總結(jié)

    在PHP開(kāi)發(fā)中,比起Cookie,Session 是存儲(chǔ)在服務(wù)器端的會(huì)話,相對(duì)安全,并且不像 Cookie 那樣有存儲(chǔ)長(zhǎng)度限制,PHP處理會(huì)話函數(shù)包括:session_start、session_register、session_is_registered、session_unregister、Session_destroy等等,這里詳細(xì)介紹下php處理會(huì)話函數(shù)
    2015-08-08
  • win平臺(tái)安裝配置Nginx+php+mysql 環(huán)境

    win平臺(tái)安裝配置Nginx+php+mysql 環(huán)境

    本文給大家分享的是win平臺(tái)安裝配置Nginx+php+mysql 環(huán)境的方法和步驟,有需要的小伙伴可以參考下。
    2016-01-01
  • PHP超全局?jǐn)?shù)組(Superglobals)介紹

    PHP超全局?jǐn)?shù)組(Superglobals)介紹

    這篇文章主要介紹了PHP超全局?jǐn)?shù)組(Superglobals)介紹,本文講解了概述、變量的作用域、超全局?jǐn)?shù)組及注意事項(xiàng)等內(nèi)容,需要的朋友可以參考下
    2015-07-07
  • 使用php清除bom示例

    使用php清除bom示例

    本文主要介紹了使用PHP去除文件BOM頭的的示例,需要的朋友可以參考下
    2014-03-03
  • Linux下搭建swoole實(shí)現(xiàn)php消息推送的方法

    Linux下搭建swoole實(shí)現(xiàn)php消息推送的方法

    Swoole使用純C語(yǔ)言編寫,提供了PHP語(yǔ)言的異步多線程服務(wù)器,異步?TCP/UDP?網(wǎng)絡(luò)客戶端,異步?MySQL,異步?Redis,數(shù)據(jù)庫(kù)連接池,AsyncTask,消息隊(duì)列,毫秒定時(shí)器,異步文件讀寫,異步DNS查詢,完美支持PHP語(yǔ)言,本文講解Linux下搭建swoole實(shí)現(xiàn)php消息推送的方法
    2024-03-03
  • php定時(shí)執(zhí)行任務(wù)設(shè)置詳解

    php定時(shí)執(zhí)行任務(wù)設(shè)置詳解

    這篇文章主要介紹了php定時(shí)執(zhí)行任務(wù)設(shè)置的方法,非常簡(jiǎn)單,有需要的小伙伴參考下。
    2015-02-02

最新評(píng)論

彭泽县| 三河市| 马鞍山市| 临潭县| 大丰市| 北海市| 水城县| 东方市| 筠连县| 麻栗坡县| 南华县| 洛川县| 丘北县| 班戈县| 马关县| 湘潭市| 灌南县| 沁源县| 河西区| 汉中市| 商丘市| 集安市| 江达县| 长丰县| 台北市| 武平县| 贡山| 青岛市| 甘德县| 黔江区| 杭州市| 威远县| 奉化市| 海丰县| 文安县| 溧水县| 师宗县| 闸北区| 开江县| 银川市| 柯坪县|