上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题, 欢迎一起讨论. 下面重点详细讲解我们常用的 Get 和 Post 请求 ( 以. net core2.2 的 Http[Verb]为方向 , 推荐该属性路由), 如果想验证, 直接利用 VS2017 创建 ASP.NET Core API (.net core 2.2), 在 DefaultController 里面操作. 文中有些关键字, 我是加了粗的, 请注意一下
帮助回忆, Get 和 Post 区别?
get 参数通过 url 传递, post 放在 request body 中.
get 请求在 url 中传递的参数是有长度限制的, 而 post 没有.
get 比 post 更不安全, 因为参数直接暴露在 url 中, 所以不能用来传递敏感信息.
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(返回数据).
在做数据查询时, 建议用 get 方式; 而在做数据添加, 修改或删除时, 建议用 post 方式;
Get 请求
无参请求
1)默认方式
什么是默认方式呢? 就是你整个 Controller 里面只有唯一一个 HttpGet 请求方式, 请求路径: API/[controller] . 代码如下图:
如果有两个呢? 如下图以及前端页面返回异常结果:
返回结果提示有多个匹配项并报出异常, 这个是为啥? 明明两个方法名都不一样. 其实是: 当我们利用 VS2017 .net core 生成 API 项目时, ASP.NET Core API 项目默认使用属性路由, 不是 ASP.NET API 的传统路由啦. 当然 ASP.NET Core API 也可以设置路由为传统路由.
微软: 生成 REST API 时, 支持使用 Http[Verb] 属性的属性路由 (就是本文所阐述的内容), 并且很少会在操作方法上使用 [Route(...)]. 建议使用更特定的 Http[Verb] Attributes 来明确 API 所支持的操作. REST API 的客户端需要知道映射到特定逻辑操作的路径和 Http 谓词.(个人觉的 Http[Verb] 属性路由比 Route 属性路由简洁)
2)路由模板设置
但现实是, 我的 Controller 里面不可能只有一个 httpGet 方法, 怎么办? 引出路由模板的概念
如下图, 可以看到 httpGet 属性提供了一个路由模板设计, 两个可选的. template 意思是新的路由模板, Name 可以 new 一个新的 HttpGetAttribute,Order 是可以设置请求处理顺序
对应进行设置, 及相应结果如下:
有参请求
1)默认方式
如果是单单利用 id 去获取一条数据, 利用如下图所示就可以达到, 此种方式请求路径操作简单 API/values/id 就行, 大括号里面的 {} 名称必须和参数名保持一致
如上所示不能满足 get 的多个参数请求方式, 如果有多个参数又要使用 get 请求, 就要回到老套路, 如下图所示
2)路由模板设置
同样, 新路由模板携带方便请求的简约参数 nameid 就行, 大括号里面的 {} 名称必须和参数名保持一致
如上图不能满足新路由模板 get 的多个参数请求方式, 如果有多个参数又要使用 get 请求, 就要回到老套路, 如下图所示
Post 请求
无参请求
1)默认方式
如下图所示, 由于请求路径是 / API/values, 所以整个 controller 会寻找 Post 请求
请求路径:/API/[controller]
但是如果此时有另外一个 Post 方法, 又没有重命名新的模板, 无论是有没有参数, 都会报错的. 因为 API/values 请求路径只会去找 POST 请求方式. 所以要进行下面的路由模板设置
2)路由模板设置
跟 httpGet 请求方式的路由模板设置一样, 同样有 template,Name,Order 三个参数可设置, 后面两个可选.
请求路径:/API/values/PostMethod
有参请求
1) 默认方式
尝试了很多方式, 最终发现如下可行, 请求路径:/API/[controller]
Ajax 和 PostMan 请求都需要 contentType: "application/x-www-form-urlencoded" , 重点是不能使用 [ApiController] 和[FromBody] 进行修饰(暂且不评论)
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) {
- }
- });
2)路由模板设置
跟 httpGet 请求方式的路由模板设置一样, 同样有 template,Name,Order 三个参数可设置, 后面两个可选.
请求路径:/API/[controller]/PostName
3)组合参数请求
如果即有复杂类型参数, 又有简单类型参数同时存在, 怎么办呢, 如下所示:
此时请求控制器是要有显示属性 [ApiController] 即可. 请求方式如下:
请求路径:/API/todo?name=xiaoming&id=20
4)动态类型
如下图所示, 是支持 dynamic 的类型的参数的, contentType:"application/json"
请求路径:/API/todo
总结
欢迎讨论, 欢迎讨论, 欢迎指出不正确之处, 欢迎一起学习!
来源: https://www.cnblogs.com/zhan520g/p/10303225.html