2023年6月20日发(作者:)

vs2017开发webapi应⽤学习笔记⼀、新建web api 项⽬在vs2017中选择新建项⽬-选择 web 应⽤程序,在如下图⽰项⽬选择窗⼝中,选择“空“项⽬,勾选 Web Api,确定后系统⾃动创建空的Web Api项⽬;⼆、设置路由默认情况下创建的Web Api 项⽬采⽤"api/{controller}/{id}" 的⽅式映射访问路由,即:api为默认路径前缀,controller对应为控制器名称中去掉controller中的部分,⽽接⼝名称采⽤get前缀的⽅法,即访问接⼝的method采⽤get,其它的依次类推,访问接⼝⾮常的机械且难以理解,可在控制器中使⽤RoutePrefix属性重新定义控制对应的访问路径名称,在⽅法中使⽤Route属性映射⽅法的访问路径,使⽤HttpGet等属性映射⽅法的访问method,这样可提⾼整个应⽤的灵活性和规范性;三、在web api中启⽤会话⽀持web api默认情况并不⽀持会话,通过 n访问相关会话对象时,总是为null,需要使⽤以下⽅法启⽤会话⽀持:重写对象对的 Init() ⽅法,⽰例代码如下:

public override void Init() { //=======================启⽤会话============================= thenticateRequest += (sender, e) => sionStateBehavior(ed); (); }四、对接⼝启⽤访问认证新建RequestAuthorizeAttribute类,该类继承⾄AuthorizeAttribute,重写⽗类的OnAuthorization⽅法;在需要验证的接⼝⽅法中使⽤RequestAuthorizeAttribute属性,RequestAuthorizeAttribute代码如下: public class RequestAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(tionContext actionContext) { //从http请求的头⾥⾯获取⾝份验证信息,验证是否是请求发起⽅的ticket var authorization = ization; if ((authorization != null) && (ter != null)) { //解密⽤户ticket,并校验⽤户名密码是否匹配 var encryptTicket = ter; if (ValidateTicket(encryptTicket)) { orized(actionContext); } else { HandleUnauthorizedRequest(actionContext); } } //如果取不到⾝份验证信息,并且不允许匿名访问,则返回未验证401 else { var attributes = tomAttributes().OfType(); bool isAnonymous = (a => a is AllowAnonymousAttribute); if (isAnonymous) orization(actionContext); else HandleUnauthorizedRequest(actionContext); } } //校验⽤户名密码(正式环境中应该是数据库校验) private bool ValidateTicket(string encryptTicket) { //解密Ticket var strTicket = t(encryptTicket).UserData; //从Ticket⾥⾯获取⽤户名和密码 var index = f("&"); string strUser = ing(0, index); string strPwd = ing(index + 1); if (strUser == "test" && strPwd == "123456") { return true; } else { return false; } } }接⼝启⽤验证的⽰例代码如下: [HttpPut] [RequestAuthorize] [Route("update/{id}")] public LoginToken update(string id,[FromBody] Logins login) { ine(login); LoginToken token = new LoginToken { token = "1111111111", userId = "test", userName = "test" }; return token; }五、webApi接⼝参数1、接⼝调⽤⽅式:webap有put、get、delete、post等集中调⽤⽅式,在未显⽰说明接⼝调⽤⽅式属性时,对Get开始的⽅法默认为采⽤get⽅式(post、put、delete类似),若接⼝⽅法默认不符合约定,则需要使⽤属性明确说明;2、对get⽅法可适⽤[Fromuri] 参数,说明接⼝参数来⾃于url,⽽post、put、delete⽅法可采⽤[frombody]属性将来⾃于http数据部分的数据序列化为指定对的对象的类型,当不明确来⾃于数据部分的对象类型,对接⼝参数采⽤dynamic类型是不错的选择,⽰例如下:前端提交的数据内容: $.ajax({ type: "post", url: "localhost:27221/api/Charging/SaveData", contentType: 'application/json', data: ify({ NAME: "Jim",DES:"备注" }), success: function (data, status) {} });后端数据接⼝: [HttpPost] public object SaveData(dynamic obj) { var strName = ng(); return strName; }需要注意的是:若需要dynamic对象直接序列化为对象,需要在前端提交数据的时候,将数据⽤fy(data)序列化为json对象,否则后端得到的是层层嵌套的对象;3、接⼝采⽤对象,如下⽰例接⼝:[HttpPost] public bool SaveData(TB_CHARGING oData) { return true; }同上:明确采⽤json格式进⾏数据传递时,需要⽤fy(data)序列化为json对象对接⼝传递数组对象时,可采⽤List的类型传递接⼝参数,⽰例如下: [HttpPost] public bool SaveData(List lstCharging) { return true; }六、利⽤webApi上传⽂件前端需要content-type信息为:"Content-Type":"multipart/form-data"后端代码如下⽰例:HttpRequest httpRequest = t; foreach (string file in ) { ine([file].FileName); inStream = [file].InputStream; byte[] buffer = new byte[]; (buffer, 0, );

var filePath = h("~/" + [file].FileName); [file].SaveAs(filePath); }

2023年6月20日发(作者:)

vs2017开发webapi应⽤学习笔记⼀、新建web api 项⽬在vs2017中选择新建项⽬-选择 web 应⽤程序,在如下图⽰项⽬选择窗⼝中,选择“空“项⽬,勾选 Web Api,确定后系统⾃动创建空的Web Api项⽬;⼆、设置路由默认情况下创建的Web Api 项⽬采⽤"api/{controller}/{id}" 的⽅式映射访问路由,即:api为默认路径前缀,controller对应为控制器名称中去掉controller中的部分,⽽接⼝名称采⽤get前缀的⽅法,即访问接⼝的method采⽤get,其它的依次类推,访问接⼝⾮常的机械且难以理解,可在控制器中使⽤RoutePrefix属性重新定义控制对应的访问路径名称,在⽅法中使⽤Route属性映射⽅法的访问路径,使⽤HttpGet等属性映射⽅法的访问method,这样可提⾼整个应⽤的灵活性和规范性;三、在web api中启⽤会话⽀持web api默认情况并不⽀持会话,通过 n访问相关会话对象时,总是为null,需要使⽤以下⽅法启⽤会话⽀持:重写对象对的 Init() ⽅法,⽰例代码如下:

public override void Init() { //=======================启⽤会话============================= thenticateRequest += (sender, e) => sionStateBehavior(ed); (); }四、对接⼝启⽤访问认证新建RequestAuthorizeAttribute类,该类继承⾄AuthorizeAttribute,重写⽗类的OnAuthorization⽅法;在需要验证的接⼝⽅法中使⽤RequestAuthorizeAttribute属性,RequestAuthorizeAttribute代码如下: public class RequestAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(tionContext actionContext) { //从http请求的头⾥⾯获取⾝份验证信息,验证是否是请求发起⽅的ticket var authorization = ization; if ((authorization != null) && (ter != null)) { //解密⽤户ticket,并校验⽤户名密码是否匹配 var encryptTicket = ter; if (ValidateTicket(encryptTicket)) { orized(actionContext); } else { HandleUnauthorizedRequest(actionContext); } } //如果取不到⾝份验证信息,并且不允许匿名访问,则返回未验证401 else { var attributes = tomAttributes().OfType(); bool isAnonymous = (a => a is AllowAnonymousAttribute); if (isAnonymous) orization(actionContext); else HandleUnauthorizedRequest(actionContext); } } //校验⽤户名密码(正式环境中应该是数据库校验) private bool ValidateTicket(string encryptTicket) { //解密Ticket var strTicket = t(encryptTicket).UserData; //从Ticket⾥⾯获取⽤户名和密码 var index = f("&"); string strUser = ing(0, index); string strPwd = ing(index + 1); if (strUser == "test" && strPwd == "123456") { return true; } else { return false; } } }接⼝启⽤验证的⽰例代码如下: [HttpPut] [RequestAuthorize] [Route("update/{id}")] public LoginToken update(string id,[FromBody] Logins login) { ine(login); LoginToken token = new LoginToken { token = "1111111111", userId = "test", userName = "test" }; return token; }五、webApi接⼝参数1、接⼝调⽤⽅式:webap有put、get、delete、post等集中调⽤⽅式,在未显⽰说明接⼝调⽤⽅式属性时,对Get开始的⽅法默认为采⽤get⽅式(post、put、delete类似),若接⼝⽅法默认不符合约定,则需要使⽤属性明确说明;2、对get⽅法可适⽤[Fromuri] 参数,说明接⼝参数来⾃于url,⽽post、put、delete⽅法可采⽤[frombody]属性将来⾃于http数据部分的数据序列化为指定对的对象的类型,当不明确来⾃于数据部分的对象类型,对接⼝参数采⽤dynamic类型是不错的选择,⽰例如下:前端提交的数据内容: $.ajax({ type: "post", url: "localhost:27221/api/Charging/SaveData", contentType: 'application/json', data: ify({ NAME: "Jim",DES:"备注" }), success: function (data, status) {} });后端数据接⼝: [HttpPost] public object SaveData(dynamic obj) { var strName = ng(); return strName; }需要注意的是:若需要dynamic对象直接序列化为对象,需要在前端提交数据的时候,将数据⽤fy(data)序列化为json对象,否则后端得到的是层层嵌套的对象;3、接⼝采⽤对象,如下⽰例接⼝:[HttpPost] public bool SaveData(TB_CHARGING oData) { return true; }同上:明确采⽤json格式进⾏数据传递时,需要⽤fy(data)序列化为json对象对接⼝传递数组对象时,可采⽤List的类型传递接⼝参数,⽰例如下: [HttpPost] public bool SaveData(List lstCharging) { return true; }六、利⽤webApi上传⽂件前端需要content-type信息为:"Content-Type":"multipart/form-data"后端代码如下⽰例:HttpRequest httpRequest = t; foreach (string file in ) { ine([file].FileName); inStream = [file].InputStream; byte[] buffer = new byte[]; (buffer, 0, );

var filePath = h("~/" + [file].FileName); [file].SaveAs(filePath); }