API 文檔神器 Swagger 介紹及在 PHP 項(xiàng)目中使用

Swagger 是我目前用過(guò)的最優(yōu)秀的 Api Doc 協(xié)議沒(méi)有之一呐芥。它與其他 Api Doc 協(xié)議(如apidocjs)最大的差別在于缘缚,Swagger 不僅僅可以定義 Api 的 Route / Request Param 和 Response聋丝,還可以定義 Definitions Object / Security Definitions Object 以及 Reference Object蒲犬。

以一個(gè)電商項(xiàng)目為例陨收,系統(tǒng)里有 商品(Product)和 訂單(Order)兩個(gè) Model肛搬,其中 Order 有一個(gè) product_id 字段用于關(guān)聯(lián)對(duì)應(yīng)的商品没佑;有兩個(gè)接口,一個(gè)是獲取商品詳情 /product/{product}温赔,另一個(gè)是獲取訂單詳情 /order/{order}蛤奢,為了減少Api請(qǐng)求數(shù)量,在獲取訂單詳情時(shí)我們希望同時(shí)返回對(duì)應(yīng)的商品數(shù)據(jù)陶贼。

如果我們用 apidocjs 來(lái)寫(xiě)的話啤贩,會(huì)是類似下面的注釋

/**
 * @api {get} /product/:product Request Product information
 * @apiName GetProduct
 * @apiParam {Number} product Products unique ID.
 * @apiSuccess {String} name Name of the Product.
 * @apiSuccess {Number} price  Price of the Product.
 * @apiSuccess ... Others fields
 */
 
 /**
 * @api {get} /order/:order Request Order information
 * @apiName GetOrder
 * @apiParam {Number} order Orders unique ID.
 * @apiHeader {String} Authorization Access Token.
 * @apiSuccess {String} flow_no FlowNo of the Order.
 * @apiSuccess {String} price  Price of the Order.
 * @apiSuccess {Object} product Product of the Order
 * @apiSuccess {String} product.name Name of the Product.
 * @apiSuccess {Number} product.price  Price of the Product.
 * @apiSuccess ... Others fields
 */

可以看到 Product 的字段在兩個(gè)接口的注釋里各寫(xiě)了一遍,這就很繁瑣拜秧;另外一個(gè)更嚴(yán)重的問(wèn)題是瓜晤,如果未來(lái) Product 表的字段發(fā)生了增減,我們需要去修改每一個(gè)會(huì)輸出 Product 的接口的注釋腹纳,更繁瑣而且容易遺漏痢掠。

所以我們需要有一個(gè)可以定義 Model 字段的功能驱犹,這就是 Swagger 的 Definitions Object,我們事先將 Product 和 Order 定義成 Definitions Object:

Product:
  type: object
  properties:
    id:
      type: integer
    name:
      type: string
      price:
          type: integer

Order:
  type: object
    properties:
      id:
          type: integer
      flow_no:
            type: string
        product:
            $ref: '#/definitions/Product'

在定義 Order 的 product 字段時(shí)足画,我們使用了 $ref雄驹,也就是 Reference Object,這就是告訴 Swagger淹辞,Order 的product 字段指向了 Product 的定義医舆。

再來(lái)看看 Route / Request Param 和 Response 在Swagger 中怎么寫(xiě):

path:
    /product/{product}:
        get:
            summary: Request Product information
            parameters:
                name: product
                in: path
                required: true
                type: number
            response:
                '200':
                    description: Success
                    schema:
                        $ref: '#/definitions/Product'
    /order/{order}:
        get:
            summary: Request Order information
            parameters:
                name: order
                in: path
                required: true
                type: number
            response:
                '200':
                    description: Success
                    schema:
                        $ref: '#/definitions/Order'

通過(guò) $ref 完美解決了增減字段需要修改多處的問(wèn)題。

我在第一次使用 Swagger 的時(shí)候象缀,雖然被其強(qiáng)大的定義功能所折服蔬将,卻又對(duì)寫(xiě) Swagger 文檔極其的厭惡,因?yàn)楣俜教峁┑?Swagger Editor 速度不僅慢央星,還時(shí)不時(shí)出錯(cuò)霞怀,明明寫(xiě)對(duì)了文檔格式非要告訴我有問(wèn)題,只能刷新頁(yè)面重新加載莉给。

直到最近發(fā)現(xiàn)了一個(gè)項(xiàng)目 swagger-php毙石,通過(guò)注釋的方式來(lái)生成 JSON 格式的 Swagger 文檔,只需要通過(guò) \Swagger\scan() 函數(shù)掃描一個(gè)目錄下所有 PHP 文件的注釋 (可以創(chuàng)建一個(gè)完全只有注釋的 php 文件來(lái)放一些與 request / response 并無(wú)直接關(guān)聯(lián)的定義颓遏,比如 Security Definitions Object)徐矩。

有了 JSON 格式的文檔之后,配合 Swagger UI 就可以展示出非常美觀的 Api 文檔了叁幢,可以看這個(gè) Demo滤灯,還支持在文檔頁(yè)面直接發(fā)起 Api 請(qǐng)求,大大的方便曼玩!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳞骤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子演训,更是在濱河造成了極大的恐慌弟孟,老刑警劉巖贝咙,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件样悟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庭猩,警方通過(guò)查閱死者的電腦和手機(jī)窟她,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蔼水,“玉大人震糖,你說(shuō)我怎么就攤上這事∨恳福” “怎么了吊说?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵论咏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我颁井,道長(zhǎng)厅贪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任雅宾,我火速辦了婚禮养涮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眉抬。我一直安慰自己贯吓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布蜀变。 她就那樣靜靜地躺著悄谐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昏苏。 梳的紋絲不亂的頭發(fā)上尊沸,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音贤惯,去河邊找鬼洼专。 笑死,一個(gè)胖子當(dāng)著我的面吹牛孵构,可吹牛的內(nèi)容都是我干的屁商。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼颈墅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜡镶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起恤筛,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤官还,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后毒坛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體望伦,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年煎殷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屯伞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豪直,死狀恐怖劣摇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弓乙,我是刑警寧澤末融,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布钧惧,位于F島的核電站,受9級(jí)特大地震影響勾习,放射性物質(zhì)發(fā)生泄漏垢乙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一语卤、第九天 我趴在偏房一處隱蔽的房頂上張望追逮。 院中可真熱鬧,春花似錦粹舵、人聲如沸钮孵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巴席。三九已至,卻和暖如春诅需,著一層夾襖步出監(jiān)牢的瞬間漾唉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工堰塌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赵刑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓场刑,卻偏偏與公主長(zhǎng)得像般此,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牵现,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容