一、基于RESTful标准的Web Api

  原文讲解:https://www.cnblogs.com/lori/p/3555737.html

  微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService,它是简单,代码可读性强的,上手快的,如果要拿它和web服务相比,我会说,它的接口更标准,更清晰,没有混乱的方法名称,有的只有几种标准的请求,如get,post,put,delete等,它们分别对应的几个操作,下面讲一下:

  GET:生到数据列表(默认),或者得到一条实体数据

  POST:添加服务端添加一条记录,记录实体为Form对象

  PUT:添加或修改服务端的一条记录,记录实体的Form对象,记录主键以GET方式进行传输

  DELETE:删除 服务端的一条记录

  自带的示例

  1. public class ValuesController : ApiController
  2. {
  3. // GET api/values
  4. public IEnumerable<string> Get()
  5. {
  6. return new string[] { "value1", "value2" };
  7. }
  8.  
  9. // GET api/values/5
  10. public string Get(int id)
  11. {
  12. return "value";
  13. }
  14.  
  15. // POST api/values
  16. public void Post([FromBody]string value)
  17. {
  18. }
  19.  
  20. // PUT api/values/5
  21. public void Put(int id, [FromBody]string value)
  22. {
  23.  
  24. }
  25.  
  26. // DELETE api/values/5
  27. public void Delete(int id)
  28. {
  29. }
  30. }

二、自定义的Web Api

  自定义这里并没有多高明,说白了就是习惯了mvc的写法,不想用奇葩的restfull api

  修改WebApiConfig即可实现

  1. public static class WebApiConfig
  2. {
  3. public static void Register(HttpConfiguration config)
  4. {
  5. // Web API 配置和服务
  6.  
  7. // Web API 路由
  8. config.MapHttpAttributeRoutes();
  9.  
  10. config.Routes.MapHttpRoute(
  11. name: "DefaultApi",
  12. routeTemplate: "api/{controller}/{action}/{id}",
  13. defaults: new { id = RouteParameter.Optional }
  14. );
  15.  
  16. config.Filters.Add(new ValidataModelAttribute());
  17. config.Filters.Add(new WebApiExceptionFilterAttribute());
  18. // config.Filters.Add(new AuthFilterAttribute());//由于用java httpclient请求无法识别session,故而没使用了
  19.  
  20. config.Formatters.Remove(config.Formatters.XmlFormatter);
  21.  
  22. }
  23. }

   WebApi没有session的,可在Global.asax开启session

  1. public class WebApiApplication : System.Web.HttpApplication
  2. {
  3. //省略....
  4.  
  5. protected void Application_PostAuthorizeRequest()
  6. {
  7. if (isWebAPiRequest())
  8. {
  9. HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
  10. }
  11. }
  12. private bool isWebAPiRequest()
  13. {
  14. return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith("~/api");
  15. }
  16. }

三、使用模型验证

  直接将步骤了,呵呵

  1. 定义特性过滤:ValidataModelAttribute

  响应结果:返回状态200,和错误结果提示,而不是400等其他状态,那样返回格式不一致,状态也不对

  1. public class ValidataModelAttribute : ActionFilterAttribute
  2. {
  3. public override void OnActionExecuting(HttpActionContext actionContext)
  4. {
  5. if (!actionContext.ModelState.IsValid)
  6. {
  7. string error = string.Empty;
  8. foreach (var key in actionContext.ModelState.Keys)
  9. {
  10. var state = actionContext.ModelState[key];
  11. if (state.Errors.Any())
  12. {
  13. error = state.Errors.First().ErrorMessage;
  14. break;
  15. }
  16. }
  17. var result = new ErrorResult(error);
  18. actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, result);
  19. //actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
  20. }
  21. }
  22. }

  2.定义模型类

   可参看:https://www.cnblogs.com/kexxxfeng/p/5602656.html

  1. public class PageModel : BaseModel
  2. {
  3. [Required(ErrorMessage = "当前页不能为空")]
  4. [Range(, ,ErrorMessage = "当前页必须大于0")]
  5. public int Page { get; set; }
  6. }

  3.使用特性

    这样就能自动验证了

  1. [ValidataModel]
  2. [HttpGet]
  3. public IHttpActionResult GetPage([FromUri]PageModel model)
  4. {
  5. var dataGrid = xxx;
  6. return JsonDataResult(dataGrid);
  7. }

  这里顺便讲下使用dynamic的问题,遇到 dynamic类型报错:“object”不包含“xxx”的定义

  按网上的说法没法解决:https://www.cnblogs.com/similar/p/6716320.html

四、异常拦截

  直接上代码

  日志组件自己去搞定哈,WebApiConfig里面的配置注意配对

  Application_Start下增加过滤:  GlobalConfiguration.Configuration.Filters.Add(new WebApiExceptionFilterAttribute());  这个不确定是否真的需要

  1. public class WebApiExceptionFilterAttribute : ExceptionFilterAttribute
  2. {
  3. //重写基类的异常处理方法
  4. public override void OnException(HttpActionExecutedContext actionExecutedContext)
  5. {
  6. //1.异常日志记录(正式项目里面一般是用log4net记录异常日志)
  7. var msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "——" +
  8. actionExecutedContext.Exception.GetType().ToString() + ":" + actionExecutedContext.Exception.Message + "——堆栈信息:" +
  9. actionExecutedContext.Exception.StackTrace;
  10. LogHelper.Fatal(msg);
  11.  
  12. //2.返回调用方具体的异常信息
  13. if (actionExecutedContext.Exception is NotImplementedException)
  14. {
  15. actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
  16. }
  17. else if (actionExecutedContext.Exception is TimeoutException)
  18. {
  19. actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.RequestTimeout);
  20. }
  21. //.....这里可以根据项目需要返回到客户端特定的状态码。如果找不到相应的异常,统一返回服务端错误500
  22. else
  23. {
  24. actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
  25. }
  26.  
  27. base.OnException(actionExecutedContext);
  28. }
  29. }

五、TOKEN机制

  这部分没做成功,这里只是记录下

  其实,使用postman可以,客户端是别人做的,使用的是java httpclient,请求后,后台得不到当前用户session

  1. public class AuthFilterAttribute : AuthorizeAttribute
  2. {
  3. public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
  4. {
  5. //取出区域的控制器controller,Action
  6. string controller = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
  7. string action = actionContext.ActionDescriptor.ActionName;
  8. if (controller.ToLower() == "account" && action.ToLower() == "login")
  9. {
  10. base.OnAuthorization(actionContext);
  11. }
  12. else
  13. {
  14. var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;
  15. var token = content.Request.QueryString["Token"];
  16. if (!string.IsNullOrEmpty(token))
  17. {
  18. //URL路径
  19. string filePath = HttpContext.Current.Request.FilePath;
  20. //校验用户名密码是否匹配
  21. if (ValidateTicket(token) && ValiddatePermission(token, controller, action, filePath))
  22. {
  23. base.IsAuthorized(actionContext);
  24. }
  25. else
  26. {
  27. HandleUnauthorizedRequest(actionContext);
  28. }
  29. }
  30. //如果取不到身份验证信息,并且不允许匿名访问,则返回未验证401
  31. else
  32. {
  33. var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
  34. bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute);
  35. if (isAnonymous)
  36. {
  37. base.OnAuthorization(actionContext);
  38. }
  39. else
  40. {
  41. HandleUnauthorizedRequest(actionContext);
  42. }
  43. }
  44. }
  45. }
  46.  
  47. private bool ValidateTicket(string encryptToken)
  48. {
  49. if (UserProvider.CurrentUser != null && UserProvider.CurrentUser.LoginToken == encryptToken)
  50. {
  51. return true;
  52. }
  53.  
  54. return false;
  55. }
  56.  
  57. public bool ValiddatePermission(string token, string controller, string action, string filePath)
  58. {
  59. //bool isPass = false;
  60. //TODO 权限验证
  61.  
  62. return true;
  63. }
  64. }

另外,推荐几篇相关的文章

WebApi系列~StringContent参数需要添加MetaType对象

WebApi系列~HttpClient的性能隐患

WebApi系列~通过HttpClient来调用Web Api接口

WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

WebApi系列~在WebApi中实现Cors访问

六、使用request form

示例:https://www.cnblogs.com/FlowerThree/articles/10275476.html

  1. var token = HttpContext.Current.Request.Headers["token"];
  2. var uid = HttpContext.Current.Request.Form["uid"];
  3. var aa = HttpContext.Current.Request.Form["list[aa]"];

ASP.NET Web API 之一 入门篇的更多相关文章

  1. Asp.Net Web API 2(入门)第一课

    Asp.Net Web API 2(入门)第一课   前言 Http不仅仅服务于Web Pages.它也是一个创建展示服务和数据的API的强大平台.Http是简单的.灵活的.无处不在的.你能想象到几乎 ...

  2. JavaScript跨域调用、JSONP、CORS与ASP.NET Web API[共8篇]

    [第1篇] 同源策略与JSONP 浏览器是访问Internet的工具,也是客户端应用的宿主,它为客户端应用提供一个寄宿和运行的环境.而这里所说的应用,基本是指在浏览器中执行的客户端JavaScript ...

  3. 01Getting Started---Getting Started with ASP.NET Web API 2入门WebApi2

    HTTP 不只是为了生成 web 页面.它也是建立公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以达到范围 ...

  4. 水果项目第3集-asp.net web api开发入门

    app后台开发,可以用asp.net webservice技术. 也有一种重量级一点的叫WCF,也可以用来做app后台开发. 现在可以用asp.net web api来开发app后台. Asp.net ...

  5. ASP.NET Web API 2 入门

    本文参考:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web ...

  6. [翻译]ASP.NET Web API 2入门

    原文:Getting Started with ASP.NET Web API 2 Step 1:新建一个Empty的Web API Project. Step 2:添加一个Model: public ...

  7. ASP.NET Web API 2 入门(一)

    前言 HTTP 不是只是为了服务的 web 页.这也是建设公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以 ...

  8. ASP.NET Web API 2入门

    1.全局配置 Web API 2之前是这样的配置的: protected void Application_Start() { //未实现特性路由 WebApiConfig.Register(Glob ...

  9. Web API 强势入门指南

    Web API是一个比较宽泛的概念.这里我们提到Web API特指ASP.NET Web API. 这篇文章中我们主要介绍Web API的主要功能以及与其他同类型框架的对比,最后通过一些相对复杂的实例 ...

随机推荐

  1. 关于表单元素的name及HTML中的id

    这种在上高级WEB课时,老师为表单元素赋了name值,之后直接在JS中使用该值而不需要使用document.get...来获取了,例: <!DOCTYPE html> <html&g ...

  2. Winform数据库连接app.config文件配置

    1.添加配置文件 新建一个winform应用程序,类似webfrom下有个web.config,winform下也有个App.config;不过 App.config不是自动生成的需要手动添加,鼠标右 ...

  3. 使用Node.js搭建数据爬虫crawler

    0. 通用爬虫框架包括: (1) 将爬取url加入队列,并获取指定url的前端资源(crawler爬虫框架主要使用Crawler类进行抓取网页) (2)解析前端资源,获取指定所需字段的值,即获取有价值 ...

  4. java多线程2

    今日大部分时间花在了C语言的链表上了,以下是我今日所学习的java多线程内容,今天学习的是多线程里的其他命令,wait,notify,nofityAll,分别是等待,唤醒,全部唤醒. 附今日敲的代码: ...

  5. Python datetime模块的介绍

    datetime模块常用的主要有下面这四个类:(要清楚import datetime : 导入的是datetime这个包,包里有各种类) 1. datetime.date   用于表示年月日构成的日期 ...

  6. monkey自定义脚本实践

    自定义脚本的稳定性测试 常规Monkey测试执行的是随机的事件流,但如果只是想让Monkey测试某个特定场景这时候就需要用到自定义脚本了,Monkey支持执行用户自定义脚本的测试,用户只需要按照Mon ...

  7. 电脑浅色显示器不显示怎么办,如何用PS去除logo底色

    本人买了新电脑后,虽然电脑显示器颜色也不错,就是刚买回来提示个true color没正确安装,我也没在意,因为感觉电脑显示方面还是不错的,后来定做安装程序用logo图的时候,有个浅色背景色,自己没看出 ...

  8. mybatis 中的 update 返回值你真的明白吗

    记录源地址:https://www.jianshu.com/p/80270b93082a

  9. 用pip下载的python模块怎么在PyCharm中引入报错

    在IDE中导入下载的模块,比如:numpy模块 你会发现虽然你安装了numpy模块,在CMD中python可以import numpy,但是你在PyCharm引不进去,为什么呢?你要是有注意的话,安装 ...

  10. ZOJ 4097 Rescue the Princess

    在这个物欲横流的社会 oj冷漠无情 只有这xx还有些温度 越界就越界吧  wrong 怎么回事.... 给出一个图 然后给出q次询问 问是否存在v和w分别到u的路径且边不重复 在边双连通分量中 任意两 ...