1. 程式人生 > >Swagger使用文件

Swagger使用文件

  • Swagger Editor: Swagger提供的一個編輯器,用來通過Swagger提供的特定的YAML語法來編寫API文件
  • Swagger Codegen: 程式碼生成器
  • Swagger UI: YAML語法定義我們的RESTful API,然後它會自動生成一篇排版優美的API文件,並且提供實時預覽。

我們只需要安裝Swagger Editor就足夠了,它基本上集成了其餘兩個工具
Swagger Editor通過遠端伺服器(http://editor.swagger.io)也可以使用,但速度較慢,我們在本機安裝。

Swagger Editor的安裝:

首先確保你的電腦安裝了NodeJs環境。

npm install -g http-server
wget https://github.com/swagger-api/swagger-editor/releases/download/v2.10.4/swagger-editor.zip
unzip swagger-editor.zip
http-server swagger-editor

執行成功後通過本機IP即可使用Swagger Editor,比通過Swagger伺服器快的多。

在Swagger Editor中定義API

通過Swagger提供的特定的YAML語法來定義API,可以詳細的描述API的方法,功能,引數,返回值等資訊。現在通過一個簡單的示例,學習編寫Swagger的YAML文件以及生成服務端程式碼。

通過Swagger定義登陸,註冊,修改,刪除四個RestFul介面:

  • 查詢所有的User => /users           使用get方法
  • 新增User => /users                 使用post方法
  • 根據某個id查詢對應的User => /users/{id}     {id}指定了你要查詢的那個id,使用get方法
  • 根據某個id刪除對應的User => /users/{id}     {id}指定了要刪除的那個id,使用delete方法
  • 修改某個id對應的User => /users/{id}        {id}指定了要修改的那個id,使用patch方法
    一個完整的,可閱讀的Swagger YAML的格式層次關係定義如下:
swagger:
info:
  title:
  description:
  version:
host: 
basePath:
schemes:
produces:
paths:
  /users:
    get:
      summary:
      description:
      tags:
      responses:
        httpResponseCode:
          description:
          schema:
        ...#與httpResponseCode同級,可描述多個狀態嗎
    post: 
      summary:
      description:
      tags:
      responses:
        httpResponseCode:
          description:
          schema:
        ...#與httpResponseCode同級,可描述多個狀態嗎

   ...#與httpMethod同級,對於同一個URL可定義多個方法,表示不同的介面
  /users/{id}:
    delete:
      summary:
      description:
      tags:
      responses:
        httpResponseCode:
          description:
          schema:
        ...#與httpResponseCode同級,可描述多個狀態嗎
    patch:
      summary:
      description:
      tags:
      responses:
        httpResponseCode:
          description:
          schema:
        ...#與httpResponseCode同級,可描述多個狀態嗎  

假設資料庫中存在一個User表,表字段為_id,username,password,alias。對該表定義出CURD操作介面

通過Swagger對於上述的介面編寫文件,示例如下:

#必要欄位!Swagger規範版本,必須填2.0,否則該YAML將不能用於Swagger其他元件
swagger: '2.0'
#必要欄位!描述API介面資訊的元資料
info:
  #介面標題
  title: swagger說明文件 
  #介面文件的描述
  description: 學習Swagger
  #版本號
  version: 1.0.0
#Swagger會提供測試用例,host指定測試時的主機名,如果沒有指定就是當前主機,可以指定埠.
host: 127.0.0.1
#定義的api的字首,必須已/開頭,測試用例的主機則為:host+bashPath
basePath: /api
#指定呼叫介面的協議,必須是:"http", "https", "ws", "wss".預設是http.-表示是個陣列元素,即schemes接受一個數組引數
schemes:
  - http
  - https
#對應與http協議頭request的Accept,呼叫者可接受型別,預設是*/*,定義的型別必須是http協議定義的 Mime Types,RestfulAPI一般定義成application/json
#這兩個是對所有介面的全域性設定,在細化的介面中是還可以對應這兩個屬性來覆蓋全域性屬性
produces:
  - application/json
#必要欄位!定義可有可操作的API
paths:
  /users:
   #必要欄位!定義HTTP操作方法,必須是http協議定義的方法
    get:
      #介面概要
      summary: 查詢所有使用者資訊
      #介面描述
      description: 查詢出所有使用者的所有資訊,使用者名稱,別名
      #標籤,方便快速過濾出User相關的介面
      tags:
        - User
      #返回值描述,必要自動
      responses:
        #返回的http狀態碼
        200:
          description: 所有使用者資訊或者使用者的集合資訊
          #描述返回值
          schema:
            #返回值格式,可選的有array,integer,string,boolean
            type: array
            #針對array,每個條目的格式,type定義為array.必要填寫items
            items:
              #引用在definitions下定義的Users
              $ref: '#/definitions/User'
        #執行出錯的處理
        default:
          description: 操作異常,執行失敗.返回資訊描述錯誤詳情
          schema:
            #值型別
            type: object
            #定義屬性
            properties:
            #屬性名
              message:
                #型別
                type: string
    #即對於同一個url定義兩個不同的方法,表示兩個介面
    post:
      description: 註冊一個使用者
      #請求引數
      parameters:
          #引數key
        - name: username
          #傳遞方法,formData表示表單傳輸,還有query表示url拼接傳輸,path表示作為url的一部分
          #body表示http頭承載引數(body只能有一個,有body不能在有其他的)
          in: formData
          #引數描述
          description: 使用者名稱,不能使用已經被註冊過的
          #引數是否必要,預設false
          required: true
          #引數型別,可選的包括array,integer,boolean,string.使用array必須使用items
          type: string
        - name: password
          in: formData
          description: 使用者登陸密碼,加密傳輸,加密儲存
          required: true
          type: string
        - name: alias
          in: formData
          type: string
          description: 使用者別名
          #非必要欄位
          required: false
      responses:
        #返回的http狀態碼
        200:
          description: 通過返回值來標示執行結果 返回true表示執行成功
          schema:
             #值型別
              type: object
              #定義屬性
              properties:
              #屬性名
                status:
                  #型別
                  type: boolean
                  #描述
                  description: 是否成功
        #執行出錯的處理
        default:
          description: 操作異常,執行失敗.返回資訊描述錯誤詳情
          schema:
            #值型別
            type: object
            #定義屬性
            properties:
            #屬性名
              message:
                #型別
                type: string
  /users/{id}:
    #{id}表示id為請求引數,例如/users/1,/users/2都是對該API的請求,此時id即為1和2
    get:
      summary: 根據使用者名稱id查詢該使用者的所有資訊
      description: 查詢出某個使用者的所有資訊,使用者名稱,別名等
      tags:
        - User
      parameters:
        #上面介面中定義了{id},則引數列表中必須包含引數id,並且請求型別為path
        - name: id
          in: path
          description: 要查詢的使用者的使用者名稱,它是唯一標識
          required: true
          type: string
      responses:
        200:
          description: 所有使用者資訊或者使用者的集合資訊
          schema:
              $ref: '#/definitions/User'
        default:
          description: 操作異常,執行失敗.返回資訊描述錯誤詳情
          schema:
              #值型別
              type: object
              #定義屬性
              properties:
              #屬性名
                message:
                  #型別
                  type: string
    #http定義的delete方法,刪除一個資源
    delete:
      summary: 刪除使用者
      description: 刪除某個使用者的資訊,被刪除的使用者將無法登陸
      parameters:
        - name: id
          in: path
          type: string
          required: true
          description: 使用者的唯一標示符
      tags:
        - User
      responses:
        200:
          description: 通過返回值來標示執行結果 返回true表示執行成功
          schema:
             #值型別
              type: object
              #定義屬性
              properties:
              #屬性名
                status:
                  #型別
                  type: boolean
                  #描述
                  description: 是否成功
        default:
          description: 操作異常,執行失敗.返回資訊描述錯誤詳情
          schema:
              #值型別
              type: object
              #定義屬性
              properties:
              #屬性名
                message:
                  #型別
                  type: string
                  #描述錯誤資訊
    #http定義的patch方法,表示修改一個資源
    patch:
      summary: 使用者資訊修改
      description: 修改使用者資訊(使用者名稱別名)
      parameters: 
        - name: id
          in: path
          description: 使用者名稱,要修改的資料的唯一識別符號
          required: true
          type: string
        - name: alias
          in: formData
          description: 新的使用者別名
          required: true
          type: string
      tags:
        - User
      responses:
        200:
          description: 通過返回值來標示執行結果 返回true表示執行成功
          schema:
            #值型別
              type: object
              #定義屬性
              properties:
              #屬性名
                status:
                  #型別
                  type: boolean
                  #描述
                  description: 是否成功
        default:
          description: 操作異常,執行失敗.返回資訊描述錯誤詳情
          schema:
              #值型別
              type: object
              #定義屬性
              properties:
              #屬性名
                message:
                  #型別
                  type: string
                  #描述錯誤資訊
definitions:
  User:
    #值型別
    type: object
    #定義屬性
    properties:
    #屬性名
      id:
        #型別
        type: string
        #描述
        description: 使用者的唯一id
      username:
        type: string
        description: 使用者名稱
      alias:
        type: string
        description: 別名

這裡寫圖片描述

這裡寫圖片描述

生成程式碼

 以Spring為例子:
  點選Swagger Editor上方的generate server,點選Spring。則會根據該API描述生成一套基於Maven構建的Spring-Boot專案,通過安裝相關依賴,執行mvn spring-boot:run則成功執行專案,相關的介面均可進行測試。但這個mock server對於介面並沒有返回值,如果需要一個完整的mock server還需要在此基礎上使用其他工具整合。