文章出處

前面的幾篇博客,我們已經把Fabric環境搭建好了,也可以使用Go開發ChainCode了,那么我們在ChainCode開發完畢后,可以通過CLI來測試ChainCode的正確性,ChainCode開發后,接下來就是關于Application的編寫了。

Application分為2部分,一部分是關于后來業務邏輯的,也就是Web API,一般是通過RESTful的形式提供,另外一部分就是UI,當然大多數情況下都是GUI,也就是網站前端,Windows程序,APP之類的。關于前端,我由于沒啥藝術細胞,做出來的界面很丑,所以也就揚長避短,很少做前端開發,專注于后臺業務邏輯的實現。

一 簡介

在Web API的開發中,業內最知名的工具就是Swagger了,這簡直就是一件神器啊!我之前在C#開發的時候就使用ABP框架,用到了Swagger,在試著使用Go的Web開發框架Beego的時候也看到了Swagger,現在使用Node開發,想不到又用到Swagger,只能說明Swagger的跨平臺跨語言的能力太強了。Swagger可以幫助我們把API文檔化,方便進行測試。

Swagger的開發方式有2種:

  1. 使用Web開發框架中遷移過來的Swagger庫,也就是先代碼,后生成API文檔的模式。比如ABP框架中就是,我們只需要在ApiController中定義好接口和注釋好,其框架就可以幫我們生成Swagger界面。
  2. 使用Swagger的yaml文件定義API接口,定義好后,再使用Swagger官方提供的CodeGen生成對應語言的代碼。

第一種開發方式要看你使用的Web框架的支持情況,接下來我們要講的就是第二種開發方式。

二 編寫Swagger YAML

官方已經給我提供一個寵物商店的示例,并提供了強大的語法檢查和預覽功能,那就是Swagger Editor,我們直接訪問http://editor.swagger.io/ 就可以看到。如果由于某些神秘的力量,造成訪問特別緩慢或者無法訪問,我們也可以下載Swagger Editor的Image到本地來運行。

直接在安裝了Docker的環境中運行如下命令:

docker pull swaggerapi/swagger-editor
docker run -p 80:8080 swaggerapi/swagger-editor
然后就可以訪問http://{Your_Server_IP}。

不管是在線的Editor或者是本地部署的Docker,我們最終看到是這樣一個界面:

image

左邊窗口就是我們要編輯的YAML文件的內容,右邊窗口就是預覽的API文檔的效果。

關于YAML文件,其實可讀性還是很強的,大部分都不需要解釋就知道是什么意思,下面我來著重介紹以下幾個比較重要的元素:

1. host&basePath

host是指定了我們的API服務器的地址,也就是我們部署了Web API時,是部署在哪個Server上。如果我們是本地開發,而且使用了自定義端口,比如8080,那么需要改成localhost:8080。

basePath是指定API的虛擬目錄,比如我們有個獲得所有用戶列表的API是:GET /User,如果我們設定了basePath是“/api”,那么我們要訪問的路徑應該是:

GET http://localhost:8080/api/User

當然,如果我們要更規范,比如把API版本也放進去,那么我們可以設置basePath為”/api/v1”,于是我們的訪問路徑就是:

GET http://localhost:8080/api/v1/User

這個basePath參數涉及到服務器端api路由的生成,而host涉及到各個API測試時候的調用地址。

2. tags

Tags是用于我們對大量的API進行分區用的,說簡單點就是為了大量的API能夠更好看,更容易查找。我們可以為tag添加注釋,使得API文檔更容易讀懂。

Tags不涉及到后臺的改變,每一個具體的API都可以指定屬于哪個(或者哪幾個tag),然后在Swagger顯示的時候,會將這些API歸到所屬的Tag下面去。

【注意:YAML文件格式嚴格要求縮進,就像Python一樣,所以如果我們在添加元素的時候一定要注意縮進是否正確。】

比如我們新建一個Tag叫Bank,然后增加一點對這個Tag的描述,接下來我們再到/pet post下面,可以把tags增加一行,寫為銀行,然后就可以看到右邊的預覽窗口更新了,顯示了銀行這個Tag相關的API:

image

如果沒有刷新,我們可以點擊上面菜單的Edit->Convert to YAML可以看到效果。

3. paths

這是最主要的配置元素。主要的API配置都在這個環節。下面一級一級的講解。

第一級是URL,以/開頭,URL中可以指定參數。比如我們要獲得某個bankId對應的銀行信息,那么URL就是

/bank/{bankId}

第二級是HTTP方法,我們在WebAPI中主要用到的方法有:查詢get,創建post,修改put和刪除delete。因為我們是要查詢某個銀行ID對應的銀行信息,所以我們在這一級輸入get

第三級有多個元素,分別是:

tags,說明這個API是屬于哪個Tag的。

summary,對該接口的簡單描述,一句話即可。

description,顧名思義,是接口的介紹,可以寫的詳細一點。

operationId,這是對應的后臺的方法名,Swagger的路由就可以根據URL和這里的operationId找到對應的Action方法。

consumes,是客戶端往服務器傳的時候,支持什么類型,一般我們只需要保留json即可,可以把xml刪除。如果是get方法,不需要該元素。

produces,就是服務器在返回給客戶端數據的時候,是什么樣式的數據,我們仍然保留json即可。

parameters就是具體的參數,這里的設置比較復雜,包括指定參數是在URL中還是在Body中,傳入的參數是什么類型的,是否必須有該參數,對該參數的描述等。如果參數是一個對象,那么需要添加對該對象類型的引用,而對象的定義在后面definitions節點中。

responses是服務器返回的HTTP Code有哪些。每一種狀態碼表示什么意思。

security是指定該接口的安全檢查方式,如果沒有設置,那么就是匿名訪問。其引用的是securityDefinitions中的定義。

x-swagger-router-controller,這是一個擴展元素,用來指定該URL對應的后臺的Controller名。

結合上面介紹的,我們自定義一個根據ID獲取Bank對象的YAML內容如下:

/bank/{bankId} : 
  get: 
    tags: 
      - Bank 
    summary: 根據銀行ID獲得銀行基本信息 
    description: 詳細描述 
    operationId: getBankById 
    produces: 
      - application/json 
    parameters: 
      - name: bankId 
        in: path 
        description: 銀行對象的主鍵ID 
        required: true 
        type: integer 
        format: int64 
    responses: 
      '200': 
        description: 找到銀行 
        schema: 
           $ref: '#/definitions/Bank' 
      '400': 
        description: 無效的ID 
      '404': 
        description: ID對應的銀行未找到 

4. securityDefinitions

這是安全定義模塊,在這里可以定義我們WebAPI的安全認證方式,比如:

  • Basic Authentication
  • API Keys
  • Bearer Authentication
  • OAuth 2.0
  • OpenID Connect Discovery
  • Cookie Authentication

這里面這么多種認證方式,很多我也沒用過,了解不深,我主要用的是Bearer和OAuth 2.0,具體設置大家可以參考文檔:

https://swagger.io/docs/specification/authentication/

5. definitions

這里是定義我們在API中會涉及到哪些JSON對象的地方。也就是說我們在API中要POST上去的JSON或者通過GET由服務器返回的JSON,其對象都在這里定義,上面的步驟直接引用這里的定義即可。

比如我們上面需要引用到Bank對象,那么我們在這里定義如下:

Bank: 
  type: object 
  properties: 
    id: 
      type: integer 
      format: int32 
    name: 
      type: string 

如果是對象嵌套引用了其他對象,也可以通過$ref的方式引用過去,我們可以參考官方示例中的Pet對象,就引用了Category。

以上各個元素我只是簡單的講解,對于各種深入的用法,大家可以參考官方文檔:https://swagger.io/docs/

三 生成后臺代碼

只要我們預覽右邊的代碼沒有報任何錯誤,那么我們就可以生成對于的后臺代碼了。這里因為Fabric SDK是Node的,所以我們的Web API也是使用Node來開發。我們點擊Generate Server菜單下的nodejs-server選項:

image

系統會下載一個壓縮包,該壓縮包解壓后就是我們的Web API Node項目。在安裝了Node的機器上,我們使用以下命令,安裝項目所依賴的包:

npm install --registry=https://registry.npm.taobao.org
安裝完畢后,運行以下命令:
npm start
我們可以看到網站地址是:http://localhost:8080/docs
image
打開瀏覽器,訪問這個網站,就可以看到Swagger生成的UI,并看到我們自定義的獲取銀行對象的方法。

image
下面,我們來試一試傳入參數1,并調用該API,可以看到這樣的結果:
image
這里返回的是Swagger給我們Mock的一個假結果,如果我們要返回真實的結果,那么需要在Controllers文件夾中找到BankService.js,看到如下的內容:
'use strict';

exports.getBankById = function(args, res, next) { 
  /** 
   * 根據銀行ID獲得銀行基本信息 
   * 詳細描述 
   * 
   * bankId Integer 銀行對象的主鍵ID 
   * returns Bank 
   **/ 
  var examples = {}; 
  examples['application/json'] = { 
  "name" : "aeiou", 
  "id" : 0 
}; 
  if (Object.keys(examples).length > 0) { 
    res.setHeader('Content-Type', 'application/json'); 
    res.end(JSON.stringify(examples[Object.keys(examples)[0]] || {}, null, 2)); 
  } else { 
     res.end(); 
  } 
}
將Mock代碼部分刪除,將我們真實的業務邏輯寫進去即可完成我們的WebAPI的開發工作。

四 總結

Swagger真的不愧是Web API開發的神器,太好用了。另外官方還有SwaggerHub,支持多人協作編寫YAML文檔,不過是收費的。我們在項目中其實可以通過Git來管理yaml文件,因為該文件存在于WebAPI項目的api文件夾中,所以其實大家可以共同編輯,然后使用Git來合并沖突。另外Swagger還有Client,看了一些支持各種語言,各種框架,各種APP開發,真是太強大了,我由于不開發GUI,所以沒怎么接觸,需要你去研究了。


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()