详解ASP.NET Core API 的Get和Post请求使用方式
帮助回忆,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项目默认使用属性路由, 不是传统路由。传统路由会根据Url地址去匹配方法Action。

微软:生成 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] 进行修饰(暂且不评论,我觉的用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) {
}
});
2)路由模板设置
跟httpGet请求方式的路由模板设置一样,同样有template,Name,Order三个参数可设置,后面两个可选。
请求路径:/api/[controller]/PostName

3)组合参数请求
如果即有复杂类型参数,又有简单类型参数同时存在,怎么办呢,如下所示:

此时请求控制器是要有显示属性 [ApiController] 即可。请求方式如下:
请求路径:/api/todo?name=xiaoming&id=20

4)动态类型
如下图所示,是支持dynamic的类型参数的,contentType:“application/json”
请求路径:/api/todo

总结
欢迎讨论,欢迎讨论,欢迎指出不正确之处,欢迎一起学习!也鼓励大家认真写博客,巩固自己和他人。
详解ASP.NET Core API 的Get和Post请求使用方式的更多相关文章
- 详解Asp.Net Core 2.1+的视图缓存(响应缓存)
响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持. 此功能将支持ASP.NET 核心 2.1 版本. 在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保 ...
- 详解ASP.NET Core Docker部署
前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ...
- 详解 ASP.NET Core MVC 的设计模式
MVC 是什么?它是如何工作的?我们来解剖它 在本节课中我们要讨论的内容: 什么是 MVC? 它是如何工作的? 什么是 MVC MVC 由三个基本部分组成 - 模型(Model),视图(View)和控 ...
- 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”
来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...
- 三张图片详解Asp.Net 全生命周期
用三张图片详解Asp.Net 全生命周期 下面我们使用三张图片解析ASP.net的整个生命周期,我总感觉使用图片更加的清楚的说明这种问题,所以使用的这样方式 说明: 1 第一张图片从全局说明从客户端 ...
- 详解ASP.NET MVC 控制器
1 概述 在阅读本篇博文时,建议结合上篇博文:详解ASP.NET MVC 路由 一起阅读,效果可能会更好些. Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务端的 ...
- ASP.NET Core API 接收参数去掉烦人的 [FromBody]
在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody ...
- ASP.NET CORE API Swagger+IdentityServer4授权验证
简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置Id ...
- ASP.NET Core API ——Dapper的使用
ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l 创建一个IDBConnection的接口对象 l 编 ...
随机推荐
- 2019-oo-第二单元总结
2019-OO-第二单元总结 多线程电梯调度问题 思路综述 第一次作业 第一次作业是非常简单的傻瓜电梯,不需要考虑容量,不需要考虑调度策略,运用了基本的生产者消费者模型,而且生产者消费者模型也一直贯穿 ...
- HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】
最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...
- [Javascript]网页链接加上时间戳防止串用户
最近客服来报,一批用户访问公司网站的时候,由于其网络环境有代理服务器,导致A用户看到B用户的信息,这是非常尴尬的事情.解决的方法也很容易,给网址加上时间戳就可以了,用JS就能实现. JS代码如下 // ...
- 一次完整的http请求过程
转载:https://blog.51cto.com/linux5588/1351007 当我们在浏览器的地址栏输入 www.linux178.com,然后回车,回车这一瞬间到看到页面到底发生了什么呢? ...
- tensorflow-用DASC结合Inception-v3对imagenet2012聚类实现
一.目的 以imagenet2012作为数据集,用Inception-v3对图像提取特征作为输入,来训练一个自编码器. 以上作为预训练模型,随后在该自编码器的基础上,中间加入一个自表示层,将最终学习到 ...
- [LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Qt如何在QTabWidget上绘图
Qt绘图事件必须在paintEvent事件下绘图,这样导致我们在向Qt设计师界面上拖拽的控件绘图时,造成了很大的麻烦. 我们不能在拖拽的控件上写paintEvent函数,但是可以自定义一个类,继承某一 ...
- 配置php环境的一个nginx.conf
文件:nginx.conf 内容: #user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/err ...
- 缺陷的背后---LIMIT M,N 分页查找
一.问题发现篇 最近组内做了一次典型缺陷分享时,翻阅2018年的缺陷,找到了一个让我觉得“有料”的bug(别的同事测试发现的),先大致简单的描述下这个问题: 需要实现的功能:从一个DB库同步某一段时间 ...
- 【论文速读】Lianwen_Jin_CVPR2017_Deep_Matching_Prior_Network_Toward_Tighter_Multi-oriented_Text_Detection
Lianwen_Jin_CVPR2017_Deep_Matching_Prior_Network_Toward_Tighter_Multi-oriented_Text_Detection 作者 关键词 ...