初體驗和實驗 Azure API Management for WSDL
前言
Azure API Management 簡單來說是可以管理自已公司各種對內、對外的機制,重點是還有各種統計分析資料可以讓開發團隊和管理階層知道那些 API 是比較多人使用,可以讓團隊知道應該把心力放在那裡。
視覺化的分析資料以及 Configuration 的方式可以統合各種不同的 WEB API 當然不單單只是轉址這麼簡單,連路徑格式和名稱都可以重新調整這才是真正強悍的地方
若是對 API Management 有進一步興趣的話可以參考這個影片
http://azure.microsoft.com/en-us/documentation/services/api-management/
另外還有一個很重要的部分就是可以直接當做文件,UT、文件、API 都直接整合在一個地方 相當方便
由於影片中的範例已經非常地清楚,而且也說明不支援 WSDL ,但我還是希望可以驗證一下 API Mamangement 可以整合到什麼地步
所以以下的做法只能當做參考,我只是將自已實驗的過程記錄下來
建立 API Management 服務
API 的來源這裡不是用 Web API ,而是使用現有的 Cloud Service 的 Web Service ( WSDL )
建立好 API Management 直接選擇 「管理主控台」以便設定 EasyDrink API 的清單
管理 API
要注意的是 URL 的部分,若是 WSDL 的話只要前面的名稱即可。
http://easydrink.cloudapp.net/easydrinkwebservice.asmx?op=GetProductVoteTop10
而 suffix 的部分則是API Management 的第一層分類
基本上跟 Web API 的用法都一模一樣
接下來要設定 WSDL 的 Method 那些要加入
這裡特別將 舊式的 URL 路徑
http://easydrink.cloudapp.net/easydrinkwebservice.asmx?op=GetProductVoteTop10
變更成新式 WEB API 格式
Http://Easydrink.azure-api.net/easydrink/GetProductVoteTop10
另外可以在 Parameters 、Body 和 Response 加上文件說明,這樣子日後其他人要使用的話就知道應該要傳什麼資料
最後應該會是這樣子的方式呈現
設定完成後選擇剛剛加入的清單
設定 API Products
接下來就要設定每一個服務的對外統一名稱,系統會自動內建 Starter 和 Unlimited 。
這裡重新建立了新的 Product 取名為 Public
基本上這樣子可以設定那些群組的人可以存取,這裡區分了 Admin , Dev , Guest
加入剛剛設定好的 API
Echo API 也是 系統預設的,不喜歡的話可以直接刪除。
確定無誤後記得按上面的 Publish 這樣子才可以正式對外公開使用
這樣代表已經全部完成了
到 Developer Portal 測試 API
目前為止都沒有特別處理什麼,只是簡單的轉址和轉換格式而已。產出的內容都會是跟原本的 WSDL 一模一樣。
API Management 並不是單純轉址,還提供了 Portal 可以讓我們直接在網頁上進行 API 驗證
進到我們剛剛新增的頁面後可以看到測試畫面了
大家都知道 WSDL 是用 POST 的方式將 Request Header 和 Body 的 SOAP 資訊送到 Server 上後再處理,因為以前沒有 URL Router 的概念所以都是透過 Body 來判讀
因此這裡分別將 Http Request Header
SOAPAction: http://tempuri.org/GetProductVoteTop10
和 Request Body 分別代入
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetProductVoteTop10 xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>
POST 送出!
YES 正確地出現 200
而且有將原本的資料回傳出來
透過 Policies 將 XML轉換成 JSON
當然現在輸出 XML 都會被嫌胖,那轉換成 JSON 又要改程式。是不是有什麼方式可以讓前端 Device 可以改用 JSON 的方式接收呢?JavaScript 可以吃 長度還可以節省。
那麼就當然要透過 API Management 的 Policy 來處理了
選擇好 Operation 之後可以修改 Inbound 和 outbound 的設定 ,有興趣的朋友可以參考 MSDN 的說明
這裡用了兩種其中一個是 Request Header 自動幫我代入 SOAPAction ,另外一個則是 XML to JSON 的項目。只要從右邊點選就會自動帶進來了不用自已打。
以下是供參考
<policies>
<inbound>
<set-header name="SOAPAction" exists-action="override">
<value>http://tempuri.org/GetProductVoteTop10</value>
<!-- for multiple headers with the same name add additional value elements -->
</set-header>
<base />
<rewrite-uri template="/easydrinkwebservice.asmx" />
</inbound>
<outbound>
<base />
<xml-to-json kind="javascript-friendly" apply="always" consider-accept-header="false" />
</outbound>
</policies>
重新驗證後可以看到,我這次只有代入 Request Body 的 SOAP 資訊。上面的 Request Header 就不需要再輸入了 ( 清空也沒有問題 )
OK 回應正常
而且輸出的格式也一併幫我更換成 JSON 語法
不過還是要再提醒大家,由於目前 API Management 目前本來就沒有支援 WSDL 所以這個是正常的。但從這裡可以看到只要符合 HTTP 機制也是沒有問題的
這樣子無論是對外營運收費,還是內部使用要整合散落在各地的 API 就可以考慮不用自已寫,而是可以用 API Management 來整合這些所有的工作。
完全不用寫一行程式,也不用改原來的服務是不是讓我們的工作又減輕很多了呢?