當前位置:成語大全網 - 新華字典 - 在線接口設計-如何正確合理的設計壹個接口項目

在線接口設計-如何正確合理的設計壹個接口項目

App和Web的通用接口該怎麽設計

1、在接口定義中確定MVC的GET或者POST方式

由於我們整個WebAPI平臺是基於MVC的基礎上進行的API開發,因此整個WebAPI的接口,在定義的時候,壹般需要顯示來聲明接口是[HttpGet]或者[HttpPost],雖然有些接口也可以不用聲明,但是避免出現類似下面的錯誤信息,顯式聲明還是有好處的。

請求的資源不支持http方法“POST

例如在基類定義的查找對象接口如下所示。

///<summary>

///查詢數據庫,檢查是否存在指定ID的對象

///</summary>

///<paramname="id">對象的ID值</param>

///<returns>存在則返回指定的對象,否則返回Null</returns>

[HttpGet]

publicvirtualTFindByID(stringid,stringtoken)

如果是增刪改的接口,壹般需要聲明為POST方式提交數據,而且基於安全性的考慮,需要攜帶更多的參數。

///<summary>

///插入指定對象到數據庫中

///</summary>

///<paramname="info">指定的對象</param>

///<returns>執行操作是否成功。</returns>

[HttpPost]

publicvirtualCommonResultInsert(Tinfo,stringtoken,stringsignature,stringtimestamp,stringnonce,stringappid)

2、動態對象的接口定義

在壹般的WebAPI接口裏面,我們可能都會碰到很多簡單類型的參數,但是又想讓它們以POST方式提交數據,那麽我們就可以有兩種方法來處理,壹種是定義壹個類來放置這些參數,壹種是采用動態的JObject參數,前者有很多不方便的地方,因為我們不可能為每個接口參數定義多壹個實體類,這樣可能會有很多難以管理的類定義。如下面是微信API的調用接口案例,我們也需要設置這樣的處理規則。

接口調用請求說明

http請求方式:POST(請使用https協議)

POST數據格式:json

POST數據例子:{"group":{"id":108,"name":"test2_modify2"}}

那麽我們采用JObject是這麽樣的呢,我們來看接口的定義和處理代碼。JObject是命名空間下的壹個對象。

///<summary>

///修改用戶密碼

///</summary>

///<paramname="param">包含userName和userPassword的復合對象</param>

///<paramname="token">用戶訪問令牌</param>

///<returns></returns>

[HttpPost]

publicCommonResultModifyPassword(JObjectparam,stringtoken)

{

//令牌檢查,不通過則拋出異常

CheckResultcheckResult=CheckToken(token);

dynamicobj=param;

if(obj!=null)

{

stringuserName=;

stringuserPassword=;

boolsuccess=BLLFactory<User>.(userName,userPassword);

returnnewCommonResult(success);

}

else

{

thrownewMyApiException("傳遞參數出現錯誤");

}

}

其中我們把JObject對象轉換為我們所需要的對象的時候,因為我們沒有定義具體的實體類,因此采用了dynamic語法,聲明這是壹個動態對象,由運行時獲取對應的屬性。

dynamicobj=param;

這樣我們就可以在調用的時候,動態POST對應的JSON對象給WebAPI接口,而不需要預先定義各種接口參數的類了。

///<summary>

///調用WebAPI接口,修改用戶密碼

///</summary>

///<paramname="userName">用戶名稱</param>

///<paramname="userPassword">修改的密碼</param>

///<returns>如果修改成功返回true,否則返回false</returns>

publicboolModifyPassword(stringuserName,stringuserPassword)

{

varaction="ModifyPassword";

varpostData=new

{

userName=userName,

userPassword=userPassword

}.ToJson();

stringurl=GetTokenUrl(action);

CommonResultresult=JsonHelper<CommonResult>.ConvertJson(url,postData);

return(result!=null)?:false;

}

其中GetTokenUrl是根據token和API的地址等參數,構建壹個完整的提交地址。我們在上面代碼通過

varpostData=new

{

userName=userName,

userPassword=userPassword

}.ToJson();

就可以動態創建壹個對象,並生成它的JSON字符串,把數據POST提交到對應的API接口裏面即可,然後對結果進行對象的轉換就算完成了。

3、集合和分頁的處理

在很多接口裏面,我們都需要用到分頁的處理,WebAPI也不例外,這樣可以提交數據檢索效率,減少服務器數據處理的壓力,同時也提交客戶端的數據顯示速度。

壹般的集合接口定義如下所示(通用性基類接口)。

///<summary>

///返回數據庫所有的對象集合

///</summary>

///<returns>指定對象的集合</returns>

[HttpGet]

publicvirtualList<T>GetAll(stringtoken)

{

//檢查用戶是否有權限,否則拋出MyDenyAccessException異常

(,token);

List<T>list=();

returnlist;

}

但是這樣的返回記錄會比較多,壹般情況下需要分頁,那麽分頁的處理接口定義如下所示。

///<summary>

///根據條件查詢數據庫,並返回對象集合(用於分頁數據顯示)

///</summary>

///<returns>指定對象的集合</returns>

[HttpPost]

publicvirtualPagedList<T>FindWithPager(stringcondition,PagerInfopagerInfo,stringtoken)

分頁接口,在這裏返回的結果裏面,用了壹個PageList的泛型類,這個方便我們獲取當前的記錄及總數,它的定義如下所示。

///<summary>

///分頁集合

///</summary>

///<typeparamname="T">對象</typeparam>

publicclassPagedList<T>

{

///<summary>

///返回記錄的總數

///</summary>

publicinttotal_count{get;set;}

///<summary>

///列表集合

///</summary>

publicList<T>list{get;set;}

}

最後整個分頁的處理WebAPI接口實現如下所示。

///<summary>

///根據條件查詢數據庫,並返回對象集合(用於分頁數據顯示)

///</summary>

///<returns>指定對象的集合</returns>

[HttpPost]

publicvirtualPagedList<T>FindWithPager(stringcondition,PagerInfopagerInfo,stringtoken)

{

//檢查用戶是否有權限,否則拋出MyDenyAccessException異常

(,token);

List<T>list=(condition,pagerInfo);

//構造成Json的格式傳遞

varresult=newPagedList<T>(){total_count=,list=list};

returnresult;

}

最後客戶端調用分頁的WebAPI代碼如下所示。

///<summary>

///根據條件查詢數據庫,並返回對象集合(用於分頁數據顯示)

///</summary>

///<paramname="condition">查詢的條件</param>

///<paramname="pagerInfo">分頁實體</param>

///<returns>指定對象的集合</returns>

publicvirtualList<T>FindWithPager(stringcondition,refPagerInfopagerInfo)

{

varaction="FindWithPager";

stringurl=GetTokenUrl(action)+("&condition={0}",condition);

varpostData=();

List<T>result=newList<T>();

PagedList<T>list=JsonHelper<PagedList<T>>.ConvertJson(url,postData);

if(list!=null)

{

=_count;//修改總記錄數

result=;

}

returnresult;

}

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,並提供給接口提供者(服務器)壹個可訪問的callbackURL(用於接口access_token)。

2.接口調用者使用clientid,clientsecret作為參數,向接口提供者發送請求。

接口提供者訪問callbackURL發送access_token(有時間限制,超時後重新獲取)。

3.接口調用者使用access_token作為參數,調用其他接口獲取相關信息。

4.接口調用者在access_token超時後重新獲取access_token。

有個疑問:

僅為了防止非法用戶隨意使用接口,需要這個復雜的機制嗎?

接口使用https連接,可以確保數據保密性。

所以是否可以簡化上面的流程,僅在接口服務者中配置壹個access_token,

接口使用者只需要提供正確的access_token即可正常使用其他接口。

如何正確合理的設計壹個接口項目

了解原型,其實更多是為了幫助妳設計接口時需要提供的數據和結構。但有時當妳設計時並沒有原型,所以此條並不是必須要求的。但假如設計完接口後原型出來了,我們也可以拿原型還驗證接口設計是否正確、合理。