1 RESTful:架构风格,就是以资源为视角,来描述服务的。
因为移动互联网时代来临:用json/xml来描述,http方法 统一了数据操作
它的目标是用来找数据,而不是看重接口。
表现层的状态转换;资源;统一接口;URI;无状态;
资源:实体就是资源,json/xml 数据流
统一接口:CRUD,是通过http的method体现 get,post.put/patch.delete
URI:url
无状态:如http协议就是无状态的 前后没有关联
路由过程:
1 启动 Global.asax的Application_Start -> WebApiConfig.Resgister -> 把路由规则写入一个容器
2.运行 请求会去容器匹配 -> 找的是控制器 -> 然后找action
a.以特性为准[HttpGet]
b.以Get开头的
c.优先最匹配的
一个资源,同一种操作更新,可能有多个来源途径
版本号:v1/v2等 - 使用默认路由基本做不到
特性路由:
1. 注册config.MapHttpAttributeRoutes();特性路由
2. 控制器/action都可以写特性
WebApi 传递参数和数据获取有很多坑 --
Http协议:无状态的协议 客户端和服务端就是一次性的。
传输内容字符串: 客户端-服务端:request header body 文字描述了数据信息。
服务端,解析字符串,拿到关注的信息,完成业务操作,返回字符串。
response header body。
实例化参数,参数只有两个来源:地址参数;表单参数;
调用方法的参数,都是来源于这个解析,其实不解析也可以拿到,比如HttpContext.Current.Requert
那些所谓的坑,其实就是webapi自己识别参数的时候,遗漏的小问题。
如果想要从根本上避免,只能去重写绑定。
否则,就只能根据规则。
Get - 实体传输:
1、[FormUri] : 前台传递实体json的情况下,在后台接口参数加上[FromUri] 就可以自动绑定了。
2、[FormBody] : 这种情况,后台无法自动绑定。
3、先Json序列化实体,再传递 和传递单纯的参数一样。
{user : Json.stringify(data)}
Post - form参数
1、post请求 [FromBody] 默认绑定表单参数,不是按照key-value格式 而是按 =value格式 只有一个数据的时候不要Key。
2、如果想要传递的是key-value 格式,那就直接传递一个实体对象。
3、可以进行Json序列化 然后传递 不过需要指定传递的格式为json格式 - contentType:'application/json' ,不指定也是无效的。
4、如果需要传递两个或以上的实体参数 - 直接包成一个对象然后Json序列化传递
想拿到数据,一定可以使用 HttpContext.Current.Request.Form[];
或者使用dynamic 来拿到具体的数据 不过在方法的入参不能是dynamic 但是可以把人参赋值给dynamimc来拿到数据! - 入参一般为 JObject