【WEB API專案實戰乾貨系列】- API訪問客戶端(WebApiClient適用於MVC/WebForms/WinForm)(四)

DukeCheng發表於2015-10-24

這幾天沒更新主要是因為沒有一款合適的後端框架來支援我們的Web API專案Demo, 所以耽誤了幾天, 目前最新的程式碼已經通過Sqlite + NHibernate + Autofac滿足了我們基本的Demo需求.

按照既定的要求,我們的API會提供給眾多的客戶端使用, 這些客戶端可以是各種Web站點, APP, 或者是WinForm, WPF, Silverlight等諸如此類的應用,將來還有可能是各種Iot等物聯網裝置的應用,Restful API憑藉其諸多優勢,已經在移動網際網路的時代火了一把,在接下來物聯網的時代會發展的更好。

下圖是一個簡單的示意圖,我們本章的ApiClient將提供一套固定的模式,輔助客戶端來訪問我們前面幾章建立的API.

image

 

基本的HTTP傳輸

我們在實際的專案中是定義了一個ApiClient的靜態類庫,其通過HttpClient 再配合 Microsoft.AspNet.WebApi.Client類庫,專門根據我們前面寫的API做了更進一步的封裝.

 

APIClient

我們先來看一下他提供的方法簽名

image

 

Get/Post

顧名思義,這兩個用來完成常見的HttpGet/HttpPost, 只是Post的方法中多了一個Object 的postData引數,這個就是用來傳送我們要Post到API端的資料.

 

Execute

是Get,Post使用的基礎方法, Get/Post的操作都是通過他完成的操作.

引數說明:

apiUrl: api的host地址

methodName: api的方法路徑

query: 查詢條件的組合, 通常對應URL中queryString部分, 也就是URL中問號後面的部分

method: 要使用的httpMethod, 這裡支援 Get,Post,Put,Delete四種,

postData: post/put時,要傳到api端的資料, 通常已一個object, 傳送之前會通過Json.Net序列化為json.

useEndpointPrefix: 這個是指我們API的url 通常都有一個約定,就是在url的host部分後面加上api/作為開始,所以這是說url是否使用預設的這個習慣, 比如 http://xxx.com/api/xxxx

 

UploadFiles/DownloadFile

這兩個從名字也可以和容易的看出來,我們如何通過我們的api上傳跟下載檔案,這個常用的場景有 通過app更新頭像,或者從api端匯出某個檔案.

 

下面示例URL說明了我們上面引數中所對應的URL的部分

image

Query物件介紹

上面除了Query物件之外,其他的都容易理解, 在沒有Query物件的時候,我們要拼出 URL的引數部分,我們通常會需要string來拼接,更好一點的辦法是定義一個Dictionary來做自動連線, 這裡我們為了更方便,

我們定義了一個Query物件,說到這裡大家應該明白Query物件就是為了幫我們自動處理url的引數部分, 其核心基類是CoreQuery。

這裡我們看幾個內建的Query

LoginQuery

其提供了我們Login介面必要的引數, 在使用的時候我們可以直接new 一個loginQuery, 傳入api呼叫的方法.

image

 

SessionQuery

這個是我們需要授權的APi需要傳入sessionKey引數,通常我們的BaseController裡面會設計一個SessionQuery, 當發起 Api Request請求的時候,都會附上這個SessionQuery, 他會自動在API的url中附加sessionKey=xxx的引數

public class SessionQuery : CoreQuery
    {
        [Query(Name = "sessionKey")]
        public string SessionKey { get; set; }

        public SessionQuery()
        {

        }

        public SessionQuery(SessionQuery query)
        {
            this.SessionKey = query.SessionKey;
        }
    }

 

ListQuery:

可以從下面引數看到是用來處理分頁的請求的.

image

 

CoreQuery.ParmsObj屬性

除了常規的引數需要通過自定義單獨的Query物件之外,對於一些很簡單的APi, 如果我們需要對每個API介面都建立一個Query那豈不是很麻煩?

針對這個問題,我們想出了通過匿名物件來解決這個問題, CoreQuery下面有一個ParmsObj屬性, 在使用的時候可以通過

image

這種方式來動態的新增url引數,這樣會大大減少我們定義的Query類的數量.

 

來張WebApiClient的類庫全圖

image

這個WebApiClient可以很好的在Mvc, Winform等.NET專案中使用, 幫助你的客戶端應用快速接入你開發的API.

 

本章程式碼: https://code.csdn.net/ODotNet/odn-webapiclient/tree/master

同時已釋出到 Nuget, 大家可以通過 Install-Package Odn.WebApiClient 來新增到專案中引用

PM> Install-Package Odn.WebApiClient

 

在今天移動網際網路的時代,作為攻城師的我們,誰不想著只寫一套API就可以讓我們的Web, Android APP, IOS APP, iPad APP, Hybired APP, H5 Web共用共同的邏輯呢? 【WEB API專案實戰乾貨系列】教你一步步教你解決方案.

相關文章