因為我們整個WebAPI平臺都是在MVC的基礎上開發的,所以整個WebAPI的接口在定義的時候壹般都需要顯示出來聲明接口是【HttpGet】或者【HttpPost】。盡管有些接口不需要聲明,但避免以下錯誤消息是有益的。
請求的資源不支持http方法“POST”
例如,基類中定義的查找對象接口如下。
///& lt;總結& gt
///查詢數據庫以檢查是否存在具有指定ID的對象。
///& lt;/summary & gt;
///& lt;param name =“id“& gt;對象的ID值
///& lt;退貨& gt如果指定對象存在,則返回該對象,否則返回null
【HttpGet】
public virtualtfindbyid(string id,stringtoken)
如果添加、刪除或修改接口,壹般需要在POST模式下提交數據,出於安全考慮,需要攜帶更多參數。
///& lt;總結& gt
///將指定對象插入數據庫
///& lt;/summary & gt;
///& lt;param name =“info“& gt;指定的對象
///& lt;退貨& gt手術是否成功。& lt/returns & gt;
【HttpPost】
public virtualcommonresultinsert(Tinfo,stringtoken,stringsignature,stringtimestamp,stringnonce,stringappid)
2.動態對象的接口定義
在壹般的WebAPI接口中,我們可能會遇到許多簡單類型的參數,但我們希望它們通過POST提交數據,因此我們可以有兩種方法來處理它們。壹種是定義壹個類來放置這些參數,另壹種是使用動態JObject參數。前者有許多不便之處,因為我們不能為每個接口參數多定義壹個實體類,因此可能會有許多難以管理的類定義。比如下面是微信API的壹個調用接口案例,我們也需要設置這樣的處理規則。
接口調用請求描述
Http請求方法:POST(請使用https協議)
發布數據格式:json
帖子數據示例:{“group“:{“ID“:108,“name“:“test2 _ modify 2“} }
那麽我們如何采用JObject呢?讓我們看看接口的定義和處理代碼。job object是命名空間下的對象。
///& lt;總結& gt
///修改用戶密碼
///& lt;/summary & gt;
///& lt;param name =“param“& gt;包含用戶名和用戶密碼的復合對象
///& lt;param name =“token“& gt;用戶訪問令牌
///& lt;退貨& gt& lt/returns & gt;
【HttpPost】
publicconresultmodifypassword(jobobjectparam,stringtoken)
{
//令牌檢查。如果失敗,將引發異常。
CheckResultcheckResult = check token(token);
dynamicobj = param
if(obj!=null)
{
string username =;
string user password =;
boolsuccess = BLLFactory & lt用戶& gt。(用戶名、用戶密碼);
returnnewCommonResult(成功);
}
其他
{
ThrownewMyApiException(“傳遞參數時出錯“);
}
}
其中,當我們將job object對象轉換為我們需要的對象時,由於我們沒有定義具體的實體類,因此我們采用了動態語法來聲明它是壹個動態對象,相應的屬性由運行時獲取。
dynamicobj = param
這樣,我們就可以在調用時動態地將POST對應的JSON對象賦予WebAPI接口,而無需事先定義各種接口參數的類。
///& lt;總結& gt
///調用WebAPI接口修改用戶密碼。
///& lt;/summary & gt;
///& lt;paramname=“用戶名“& gt用戶名
///& lt;param name =“user password“& gt;修改密碼
///& lt;退貨& gt如果修改成功,則返回true,否則返回false
public boolmodifypassword(stringuserName,stringuserPassword)
{
var action =“modify password“;
varpostData =新
{
用戶名=用戶名,
用戶密碼=用戶密碼
}.to JSON();
string URL = GetTokenUrl(action);
CommonResultresult = JSON helper & lt;CommonResult & gt。convert JSON(URL,post data);
返回(結果!=null)?:假;
}
其中,GetTokenUrl根據token和API地址等參數構造了壹個完整的提交地址。我們在上面傳遞了代碼
varpostData =新
{
用戶名=用戶名,
用戶密碼=用戶密碼
}.to JSON();
您可以動態創建壹個對象,生成其JSON字符串,將數據提交到相應的API接口,然後將結果轉換為對象。
3、設置和分頁處理
在很多界面中,我們需要使用分頁處理,WebAPI也不例外,它可以提高數據檢索的效率,減輕服務器數據處理的壓力,同時也提高了客戶端的數據顯示速度。
通用集合接口定義如下(通用基類接口)。
///& lt;總結& gt
///返回數據庫中所有對象的集合。
///& lt;/summary & gt;
///& lt;退貨& gt指定對象的集合
【HttpGet】
publicvirtualList<T & gtget all(string token)
{
//檢查用戶是否有權限,否則將引發MyDenyAccessException異常。
(,token);
列表& ltT & gtlist =();
returnlist
}
但是這樣的返回記錄會很多,壹般需要分頁,所以分頁的處理接口定義如下。
///& lt;總結& gt
///根據條件查詢數據庫並返回對象集合(用於分頁數據顯示)。
///& lt;/summary & gt;
///& lt;退貨& gt指定對象的集合
【HttpPost】
publicvirtualPagedList<。T & gtFindWithPager(string condition,PagerInfopagerInfo,stringtoken)
分頁接口,在這裏返回的結果中,使用了壹個PageList的泛型類,方便我們獲取當前記錄和總數。其定義如下。
///& lt;總結& gt
///分頁集合
///& lt;/summary & gt;
///& lt;type param name =“T“& gt;目標
publicclassPagedList<。T & gt
{
///& lt;總結& gt
///返回記錄總數。
///& lt;/summary & gt;
publicinttotal _ count { get設置;}
///& lt;總結& gt
///列表集合
///& lt;/summary & gt;
公共列表<T & gtlist { get設置;}
}
最後,整個分頁處理WebAPI接口實現如下。
///& lt;總結& gt
///根據條件查詢數據庫並返回對象集合(用於分頁數據顯示)。
///& lt;/summary & gt;
///& lt;退貨& gt指定對象的集合
【HttpPost】
publicvirtualPagedList<。T & gtFindWithPager(string condition,PagerInfopagerInfo,stringtoken)
{
//檢查用戶是否有權限,否則將引發MyDenyAccessException異常。
(,token);
列表& ltT & gtlist =(condition,pager info);
//構造成Json格式進行傳輸
varresult = newPagedList & ltT & gt(){total_count=,list = list };
返回結果;
}
最後,客戶端調用分頁的WebAPI代碼如下。
///& lt;總結& gt
///根據條件查詢數據庫並返回對象集合(用於分頁數據顯示)。
///& lt;/summary & gt;
///& lt;param name =“condition“& gt;查詢的條件
///& lt;param name =“pager info“& gt;尋呼實體
///& lt;退貨& gt指定對象的集合
publicvirtualList<T & gtFindWithPager(string condition,refPagerInfopagerInfo)
{
var action =“FindWithPager“;
string URL = GetTokenUrl(action)+(“& amp;condition={0}“,condition);
varpostData =();
列表& ltT & gtresult = newList & ltT & gt();
PagedList<T & gtlist = JsonHelper & ltPagedList<T & gt& gt。convert JSON(URL,post data);
如果(列表!=null)
{
= _ count//修改記錄總數
結果=;
}
返回結果;
}
4.混合框架接口集成了WebAPI接口。
在整個WebAPI平臺的構建和混合框架的集成過程中,我以相對獨立的方式開發和集成了各個模塊。他們實現了直接訪問數據庫、通過WCF服務獲取數據和通過WebAPI調用獲取數據的統壹,從而實現了整個混合框架的高度集成。
整個混合框架的核心是以相對獨立的方式集成所有可重用的模塊,我們可以在壹定的基礎上快速構建統壹的應用平臺。
整個WebAPI平臺,包括服務器內容,都以API控制器的形式發布了相應的WebAPI接口。
在每個混合框架的獨立模塊中,我們封裝了相應的WebAPI客戶端調用處理,從而實現了WebAPI的調用模式。
在Win10下,使用WebAPI模式運行混合框架,得到的主要界面效果如下。
獨立模塊權限管理系統界面如下所示。
該系列文章如下:
WebAPI應用架構在Winform混合框架(1)中的應用
WebAPI應用架構在Winform混合框架中的應用(2)——自定義異常結果的處理
WebAPI界面設計經驗總結
WebAPI應用架構在Winform混合框架中的應用(3)——WinFrom接口調用WebAPI的過程分解
WebAPI應用架構在Winform混合框架中的應用(4)——使用代碼生成工具快速開發壹套完整的應用
WebAPI應用架構在Winform混合框架中的應用(5)——系統級字典與公司級字典共存。
如何設計壹個API接口,請求接口時需要認證,防止第三方隨意調用接口?如何使用界面:
1.接口調用者首先申請分配clientid、clientsecret,並向接口提供者(服務器)提供可訪問的回調URL(用於接口access_token)。
2.接口調用方使用clientid、clientsecret作為參數向接口提供方發送請求。
接口提供者訪問callbackURL以發送access_token(有時間限制,超時後將被檢索)。
3.接口調用者使用access_token作為參數來調用其他接口以獲取相關信息。
4.在access_token超時後,接口調用方重新獲取access_token。
有壹個問題:
僅僅為了防止非法用戶隨意使用接口,就需要這種復雜的機制嗎?
該接口使用https連接來確保數據機密性。
那麽能否簡化上述過程,只在接口服務器中配置壹個access_token呢?
接口用戶只需提供正確的access_token即可正常使用其他接口。
如何正確合理地設計壹個接口項目來了解原型實際上更多的是幫助您設計您需要提供的數據和結構。但是有時候妳設計的時候沒有原型,所以這篇文章沒有必要。但是如果在設計完界面後原型出來了,我們也可以用原型來驗證界面設計是否正確合理。