vs2017開發web api 應用學習筆記
發表時(shí)間:2018-12-7
發布人(rén):融晨科技
浏覽次數:67
參考網址:https://www.cnblogs.com/landeanfen/p/5337072.html,該文章對接口屬性以(yǐ)及接口參數的(de)傳遞有比較詳細的(de)描述。
一、新建web api 項目
在(zài)vs2017中選擇新建項目-選擇asp.net web 應用程序,在(zài)如下圖示項目選擇窗口中,選擇“空“項目,勾選 Web Api,确定後系統自動創建空的(de)Web Api項目;
二、設置路由
默認情況下創建的(de)Web Api 項目采用"api/{controller}/{id}" 的(de)方式映射訪問路由,即:api爲(wéi / wèi)默認路徑前綴,controller對應爲(wéi / wèi)控制器名稱中去掉controller中的(de)部分,而(ér)接口名稱采用get前綴的(de)方法,即訪問接口的(de)method采用get,其它的(de)依次類推,訪問接口非常的(de)機械且難以(yǐ)理解,可在(zài)控制器中使用RoutePrefix屬性重新定義控制對應的(de)訪問路徑名稱,在(zài)方法中使用Route屬性映射方法的(de)訪問路徑,使用HttpGet等屬性映射方法的(de)訪問method,這(zhè)樣可提高整個(gè)應用的(de)靈活性和(hé / huò)規範性;
三、在(zài)web api中啓用會話支持
web api默認情況并不(bù)支持會話,通過 HttpContext.Current.Session訪問相關會話對象時(shí),總是(shì)爲(wéi / wèi)null,需要(yào / yāo)使用以(yǐ)下方法啓用會話支持:
重寫global.asax對象對的(de) Init() 方法,示例代碼如下:
public override void Init()
{
//=======================啓用會話=============================
this.PostAuthenticateRequest += (sender, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
base.Init();
}
四、對接口啓用訪問認證
新建RequestAuthorizeAttribute類,該類繼承至AuthorizeAttribute,重寫父類的(de)OnAuthorization方法;在(zài)需要(yào / yāo)驗證的(de)接口方法中使用RequestAuthorizeAttribute屬性,RequestAuthorizeAttribute代碼如下:
public class RequestAuthorizeAttribute : AuthorizeAttribute
{
public override void> [HttpPut]
[RequestAuthorize]
[Route("update/{id}")]
public LoginToken update(string id,[FromBody] Logins login)
{
System.Diagnostics.Debug.WriteLine(login);
LoginToken token = new LoginToken { token = "1111111111", userId = "test", userName = "test" };
return token;
}
五、webApi接口參數
1、接口調用方式:webap有put、get、delete、post等集中調用方式,在(zài)未顯示說(shuō)明接口調用方式屬性時(shí),對Get開始的(de)方法默認爲(wéi / wèi)采用get方式(post、put、delete類似),若接口方法默認不(bù)符合約定,則需要(yào / yāo)使用屬性明确說(shuō)明;
2、對get方法可适用[Fromuri] 參數,說(shuō)明接口參數來(lái)自于(yú)url,而(ér)post、put、delete方法可采用[frombody]屬性将來(lái)自于(yú)http數據部分的(de)數據序列化爲(wéi / wèi)指定對的(de)對象的(de)類型,當不(bù)明确來(lái)自于(yú)數據部分的(de)對象類型,對接口參數采用dynamic類型是(shì)不(bù)錯的(de)選擇,示例如下:
前端提交的(de)數據内容:
$.ajax({
type: "post",
url: "http://localhost:27221/api/Charging/SaveData",
contentType: 'application/json',
data: JSON.stringify({ NAME: "Jim",DES:"備注" }),
success: function (data, status) {}
});
後端數據接口:
[HttpPost]
public object SaveData(dynamic obj)
{
var strName = Convert.ToString(obj.NAME);
return strName;
}
需要(yào / yāo)注意的(de)是(shì):若需要(yào / yāo)dynamic對象直接序列化爲(wéi / wèi)對象,需要(yào / yāo)在(zài)前端提交數據的(de)時(shí)候,将數據用JSON.stringfy(data)序列化爲(wéi / wèi)json對象,否則後端得到(dào)的(de)是(shì)層層嵌套的(de)對象;
3、接口采用對象,如下示例接口:
[HttpPost]
public bool SaveData(TB_CHARGING oData)
{
return true;
}
同上(shàng):明确采用json格式進行數據傳遞時(shí),需要(yào / yāo)用JSON.stringfy(data)序列化爲(wéi / wèi)json對象
對接口傳遞數組對象時(shí),可采用List<ObjectType>的(de)類型傳遞接口參數,示例如下:
[HttpPost]
public bool SaveData(List<TB_CHARGING> lstCharging)
{
return true;
}
六、利用webApi上(shàng)傳文件
前端需要(yào / yāo)content-type信息爲(wéi / wèi):
"Content-Type":"multipart/form-data"
後端代碼如下示例:
HttpRequest httpRequest = HttpContext.Current.Request;
foreach (string file in httpRequest.Files)
{
System.Diagnostics.Debug.WriteLine(httpRequest.Files[file].FileName);
System.IO.Stream inStream = httpRequest.Files[file].InputStream;
byte[] buffer = new byte[inStream.Length];
inStream.Read(buffer, 0, buffer.Length);
var filePath = HttpContext.Current.Server.MapPath("~/" + httpRequest.Files[file].FileName);
httpRequest.Files[file].SaveAs(filePath);
}