帮助回忆,Get和Post区别?前端
get参数经过url传递,post放在request body中。ajax
get请求在url中传递的参数是有长度限制的,而post没有。json
get比post更不安全,由于参数直接暴露在url中,因此不能用来传递敏感信息。api
get请求只能进行url编码,而post支持多种编码方式。浏览器
get请求浏览器会主动cache,而post不会。安全
get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。服务器
get和post质上就是tcp连接,并没有差异。可是因为HTTP的规定和浏览器/服务器的限制,致使他们在应用过程当中体现出一些不一样。并发
get产生一个tcp数据包;post产生两个tcp数据包。对于get方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于post,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
app
在作数据查询时,建议用get方式;而在作数据添加、修改或删除时,建议用post方式;tcp
什么是默认方式呢?就是你整个Controller里面只有惟一一个HttpGet请求方式,请求路径:api/[controller] 。代码以下图:
若是有两个呢?以下图以及前端页面返回异常结果:
返回结果提示有多个匹配项并报出异常,这个是为啥?明明两个方法名都不同。 实际上是:当咱们利用VS2017 .net core生成API项目时,ASP.NET Core API项目默认使用属性路由, 不是传统路由。传统路由会根据Url地址去匹配方法Action。
微软:生成 REST API 时,支持使用 Http[Verb] 属性的属性路由 (就是本文所阐述的内容),而且不多会在操做方法上使用 [Route(...)]。 建议使用更特定的 Http[Verb] Attributes 来明确 API 所支持的操做。 REST API 的客户端须要知道映射到特定逻辑操做的路径和 Http 谓词。(我的觉的 Http[Verb] 属性路由比 Route属性路由简洁)
但现实是,个人Controller里面不可能只有一个httpGet方法,怎么办?引出路由模板的概念
以下图,能够看到httpGet属性提供了一个路由模板设计,两个可选的。template意思是新的路由模板,Name能够new 一个新的HttpGetAttribute,Order是能够设置请求处理顺序
对应进行设置,及相应结果以下:
若是是单单利用id去获取一条数据,利用以下图所示就能够达到,此种方式请求路径操做简单,访问路径:api/values/id,大括号里面的{}名称必须和参数名保持一致
如上所示不能知足get的多个参数请求方式,若是有多个参数又要使用get请求,就要回到老套路,以下图所示
一样,新路由模板携带方便请求的简约参数nameid就行,大括号里面的{}名称必须和参数名保持一致
如上图不能知足新路由模板get的多个参数请求方式,若是有多个参数又要使用get请求,就要回到老套路,以下图所示
以下图所示,因为请求路径是/api/values,因此整个controller会寻找Post请求
请求路径:/api/[controller]
可是若是此时有另一个Post方法,又没有重命名新的模板,不管是有没有参数,都会报错的。由于api/values请求路径只会去找POST请求方式。因此要进行下面的路由模板设置
跟httpGet请求方式的路由模板设置同样,一样有template,Name,Order三个参数可设置,后面两个可选。
请求路径:/api/values/PostMethod
尝试了不少方式,最终发现以下可行,请求路径:/api/[controller]
Ajax和PostMan请求都须要contentType: "application/x-www-form-urlencoded" ,重点是不能使用 [ApiController] 和[FromBody] 进行修饰(暂且不评论,我觉的用Get方式就行了)
Ajax请求代码以下:
$.ajax({ type: "POST", accepts: "application/x-www-form-urlencoded", url: "/api/post", contentType: "application/x-www-form-urlencoded", data: { 'value': '张三丰' }, error: function (jqXHR, textStatus, errorThrown) { alert("Something went wrong!"); }, success: function (result) { } });
跟httpGet请求方式的路由模板设置同样,一样有template,Name,Order三个参数可设置,后面两个可选。
请求路径:/api/[controller]/PostName
若是即有复杂类型参数,又有简单类型参数同时存在,怎么办呢,以下所示:
此时请求控制器是要有显示属性 [ApiController] 便可。请求方式以下:
请求路径:/api/todo?name=xiaoming&id=20
以下图所示,是支持dynamic的类型参数的,contentType:“application/json”
请求路径:/api/todo
欢迎讨论,欢迎讨论,欢迎指出不正确之处,欢迎一块儿学习!也鼓励你们认真写博客,巩固本身和他人。