一. 基础总结

1.Restful服务改造

  Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方法名。 但是我们不喜欢这种方式,所以我们将默认的路由规则 [Route("api/[controller]")] 改为: [Route("api/[controller]/[action]")]

2.基本格式

继承 ControllerBase 类,需要加特性[ApiController].

(1) 特性[ApiController]的作用:

  a.特性路由要求,和[Route]成对出现,有了它,通过 UseMvc 定义的传统路由或通过 Startup.Configure 中的 UseMvcWithDefaultRoute 访问操作均无效。

  b.模型验证错误自动触发 HTTP 400 响应

  c.绑定源参数推理(如果没有 [ApiController] 属性,同时也没有 [FromQuery][FromBody]等 的绑定源属性,ASP.NET Core 运行时会尝试使用复杂对象模型绑定器。)

  d.Multipart/form-data 请求推理

  f.错误状态代码的问题详细信息

(2) 特性[ApiController]的作用位置:

  a.作用于controller

  b.作用于程序集,服务于整个项目。在Startup类上的namespace上添加:[assembly: ApiController]

注:它不能作用action上。

PS:MVC中的Controller类继承ControllerBase类,实现了IActionFilter, IFilterMetadata, IAsyncActionFilter, IDisposable接口。

3.路由规则

  详见  第二十节:Asp.Net Core WebApi和MVC 路由规则比较

4.常见的特性

  [Route] 指定控制器或操作的 URL 模式。

  [Bind] 指定要包含的前缀和属性,以进行模型绑定。

  [HttpGet] [HttpPost]标识支持 HTTP GET 等操作谓词的操作。

  [Consumes] 指定某个操作接受的数据类型。

  [Produces] 指定某个操作返回的数据类型。

5.绑定源参数推理

  [FromBody] 实体JSON格式的获取,和不加效果相同

  [FromForm] 请求正文中的表单数据

  [FromQuery] 请求查询字符串参数,Get请求的时候,用实体接受需要加

  [FromHeader] 请求标头

  [FromRoute] 当前请求中的路由数据

  [FromServices] 作为操作参数插入的请求服务,即将对象注入到方法中

6.允许跨域

  同Core MVC相同,详见:https://www.cnblogs.com/yaopengfei/p/11191938.html

7.过滤器

  同Core MVC相同,详见:https://www.cnblogs.com/yaopengfei/p/11232921.html, 但webapi中页面相关的过滤器不适用

二. Get和Post请求

1. Get请求

  前端JS发送Get请求的时候,后台可以分参数接收,也可以用实体接收,但是需要在实体的前面加上[FromQuery]。

 注:不能用dynamic接收,不管怎么处理都报错。

案例测试:

(1).分参数接收,可以正常访问。

(2).用实体类接收,前面加[FromQuery],可以正常访问(否则报415)。

(3).用dynamic接收,前面什么不加,报错415,前面加[FromQuery],也报错,报500。

服务器端代码:

     [Route("api/[controller]/[action]")]
[ApiController]
public class FirstController : ControllerBase
{
/******************************************下面是测试Get请求的相关方法***************************************************/ [HttpGet]
public string GetInfor1(string userName, string pwd)
{
return $"{userName}+{pwd}";
} [HttpGet]
public string GetInfor2([FromQuery]UserInfor model)
{
return $"{model.userName}+{model.pwd}";
}
[HttpGet]
//加上[FromQuery]也报错
public string GetInfor3([FromQuery]dynamic model)
{
return $"{model.userName}+{model.pwd}";
} }

前端代码:

             //一.下面是Get请求的测试
//1. 分参数接收,可以正常访问
$("#getBtn1").click(function () {
$.ajax({ url: "https://localhost:44387/api/First/GetInfor1", type: "get", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log(data); } });
});
//2. 用实体类接收,前面加[FromQuery],可以正常访问(否则报415)
$("#getBtn2").click(function () {
$.ajax({ url: "https://localhost:44387/api/First/GetInfor2", type: "get", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log(data); } });
});
//3. 用dynamic接收,前面什么不加,报错415,前面加[FromQuery],也报错,报500
$("#getBtn3").click(function () {
$.ajax({ url: "https://localhost:44387/api/First/GetInfor3", type: "get", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log(data); } });

2. Post请求

  前端JS发送Post请求的时候,可能是表单提交,也可能是JOSN格式提交,所以下面要分情况讨论:默认情况下在我们注入MVC服务时被配置使用的时JsonInputFormatter,即实体默认接受JSON格式的数据,我们如果想让它接受表单数据,需要在实体前面加[FromForm].

(1) 接收JSON格式:实体前面什么也不加 或者 实体前面加[FromBody]

(2) 接收表单格式: 实体前面加[FromForm]

注:不能分参数接收!! 用dynamic接收的时候,只能处理前端JOSN格式的数据,加[FromBody]或者不加都行, 不能处理前端表单格式数据!!

案例测试:

(1).一个参数的情况,后台分参数接收,均拿不到值

(2).表单提交,实体前面什么也不加 或者 实体前面加[FromForm],Login1 和 Login2 均报415,Login3可以正常访问

(3).JSON提交,实体前面加[FromBody],Login1,Login2正常访问,Login3能访问通,但是后台拿不到值,都为空

(4).JOSN格式,后台用dynamic能接收,加[FromBody]或者不加都可以接收

(5).表单格式,后台用dynamic不能接收,加[FromForm]或者不加都报500,报错。

服务器端代码:

     [Route("api/[controller]/[action]")]
[ApiController]
public class FirstController : ControllerBase
{ /******************************************下面是测试Post请求的相关方法***************************************************/ [HttpPost]
public string Login0(string userName)
{
return $"{userName}";
} [HttpPost]
public string Login1(UserInfor model)
{
return $"{model.userName}+{model.pwd}";
} [HttpPost]
public string Login2([FromBody]UserInfor model)
{
return $"{model.userName}+{model.pwd}";
} [HttpPost]
public string Login3([FromForm]UserInfor model)
{
return $"{model.userName}+{model.pwd}";
}
[HttpPost]
public string Login4([FromBody]dynamic model)
{
return $"{model.userName}+{model.pwd}";
} [HttpPost]
public string Login5([FromForm]dynamic model)
{
return $"{model.userName}+{model.pwd}";
}
}

前端代码:

              //二.下面是Post请求的测试
//(Post请求默认情况下为:ContentType = "application/x-www-form-urlencoded"提交表单的形式,如果要发送JOSN格式,需要加上参数contentType: 'application/json')
//PS: { userName: "admin", pwd: "123456" } 这就是一个JSON对象,也可以叫实体 //1. 一个参数的情况,后台分参数接收,均拿不到值
$("#postBtn0").click(function () {
//1.1 正常拼接,可以访问通,但是拿不到userName的值
//$.ajax({ url: "https://localhost:44387/api/First/Login0", type: "Post", data: { userName: "admin" }, success: function (data) { console.log(data); } });
//1.2 没有键,只有值,可以访问通,但是拿不到userName的值 (这里同.Net 平台下的WebApi不同)
$.ajax({ url: "https://localhost:44387/api/First/Login0", type: "Post", data: { "": "admin" }, success: function (data) { console.log(data); } });
}); //2. 表单提交,Login1 和 Login2 均报415,Login3可以正常访问
$("#postBtn1").click(function () {
$.ajax({ url: "https://localhost:44387/api/First/Login1", type: "Post", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log("Login1:" + data); } });
$.ajax({ url: "https://localhost:44387/api/First/Login2", type: "Post", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log("Login2:" + data); } });
$.ajax({ url: "https://localhost:44387/api/First/Login3", type: "Post", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log("Login3:" + data); } });
}); //3.JSON提交,Login1,Login2正常访问,Login3能访问通,但是后台拿不到值,都为空
$("#postBtn2").click(function () {
//将post请求指定为contentType: 'application/json',且传递的参数格式化成Json字符串,则可以正常访问
$.ajax({ url: "https://localhost:44387/api/First/Login1", type: "Post", contentType: 'application/json', data: JSON.stringify({ userName: "admin", pwd: "123456" }), success: function (data) { console.log("Login1:" + data); } });
$.ajax({ url: "https://localhost:44387/api/First/Login2", type: "Post", contentType: 'application/json', data: JSON.stringify({ userName: "admin", pwd: "123456" }), success: function (data) { console.log("Login2:" + data); } });
$.ajax({ url: "https://localhost:44387/api/First/Login3", type: "Post", contentType: 'application/json', data: JSON.stringify({ userName: "admin", pwd: "123456" }), success: function (data) { console.log("Login3:" + data); } }); }); //4.JOSN格式,后台用dynamic能接收,加[FromBody]或者不加都可以接收
$("#postBtn3").click(function () {
//将post请求指定为contentType: 'application/json',且传递的参数格式化成Json字符串,则可以正常访问
$.ajax({ url: "https://localhost:44387/api/First/Login4", type: "Post", contentType: 'application/json', data: JSON.stringify({ userName: "admin", pwd: "123456" }), success: function (data) { console.log("JSON:" + data); } });
});
//5.表单格式,后台用dynamic不能接收,加[FromForm]或者不加都报500
$("#postBtn4").click(function () {
$.ajax({ url: "https://localhost:44387/api/First/Login5", type: "Post", data: { userName: "admin", pwd: "123456" }, success: function (data) { console.log("表单:" + data); } });
});

3.总结

  Get请求,可以分参数接收,也可以用实体接收,需要在实体的前面加上[FromQuery]。

  POST请求,用实体接收,针对js默认的表单提交方式,实体前面加[FromForm];针对js的JSON格式的提交方式,实体前面什么也不加 或者 实体前面加[FromBody]。

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第十九节:Asp.Net Core WebApi基础总结和请求方式的更多相关文章

  1. 第二十九节: Asp.Net Core零散获取总结(不断补充)

    1. IWebHostEnvironment获取常用属性 (1).获取项目的根目录 _env.ContentRootPath 等价于 Directory.GetCurrentDirectory() ( ...

  2. 风炫安全WEB安全学习第十九节课 XSS的漏洞基础知识和原理讲解

    风炫安全WEB安全学习第十九节课 XSS的漏洞基础知识和原理讲解 跨站脚本攻击(Cross-site scripting,通常简称为XSS) 反射型XSS原理与演示 交互的数据不会存储在数据库里,一次 ...

  3. 第二百五十九节,Tornado框架-模板语言的三种方式

    Tornado框架-模板语言的三种方式 模板语言就是可以在html页面,接收逻辑处理的self.render()方法传输的变量,将数据渲染到对应的地方 一.接收值渲染 {{...}}接收self.re ...

  4. ASP.NET Core WebApi构建API接口服务实战演练

    一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...

  5. ASP.NET Core Web APi获取原始请求内容

    前言 我们讲过ASP.NET Core Web APi路由绑定,本节我们来讲讲如何获取客户端请求过来的内容. ASP.NET Core Web APi捕获Request.Body内容 [HttpPos ...

  6. asp.net core WebAPI学习以及 发布(***入门学习)

    A asp.net Core 系列[一]——创建Web应用 asp.net Core 系列[二]—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API a ...

  7. asp.net core webapi之跨域(Cors)访问

    这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...

  8. ASP.NET Core WebAPI 开发-新建WebAPI项目

    ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...

  9. Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI

    WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...

随机推荐

  1. mysql用查询结果当删除的判断条件进行删除报错1093 You can't specify target table解决方法

    mysql用查询结果当删除的判断条件进行删除报错1093 You can't specify target table解决方法 #分开两个sql执行正常的语句,只保留最新1000条数据,删掉1000条 ...

  2. 深入理解Vue组件3大核心概念

    摘要: 搞懂Vue组件! 作者:浪里行舟 原文:详解vue组件三大核心概念 Fundebug经授权转载,版权归原作者所有. 前言 本文主要介绍属性.事件和插槽这三个vue基础概念.使用方法及其容易被忽 ...

  3. Can't toast on a thread that has not called Looper.prepare()

    Android开发中Can't toast on a thread that has not called Looper.prepare()问题 说一下问题出现场景: 在一个Android项目中,利用 ...

  4. Centos7部署ejforum论坛(Java+tomcat+mysql)

    前面搭建Java环境和tomcat环境. 下面进行实战,搭建ejforum论坛 ejforum论坛源码:https://www.lanzous.com/i45rcoh Centos7安装MySQL数据 ...

  5. 201871010126 王亚涛 《面向对象程序设计(Java)》第十周实验总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  6. 杂项-FLAG

    题目 最低位隐写 50 4B 03 04 压缩格式zip的文件头 save bin 保存成zip格式 解压(WinRAR不能正常解压) 然后用vim打开(winhex也可以) hctf{dd0gf4c ...

  7. Node.js到底是做什么的?这是我看到最好的解释了

    作者:贾厂长链接:https://www.zhihu.com/question/33578075/answer/56951771来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  8. Eclipse的server选项卡中找不到tomcat配置项

    1.在Eclipse中,如果想开发j2ee,必须要先安装插件.至于具体的插件安装方法,这里不再赘述. 2.当进行到配置tomcat服务器的时候,有时候会出现这种情况: 3.在server选项卡的Run ...

  9. Windows解决端口占用问题

    Windows解决端口占用问题 步骤 1. win + R,输入cmd回车进入dos界面 2. 输入netstat -ano|findstr 8080 查看占用8080端口的进程 3. 输入taskk ...

  10. Azure产品整理

    Azure的文档真是够落地,简明易懂. 计算 Linux 虚拟机:为 Ubuntu.Red Hat 等预配虚拟机 Windows 虚拟机 为 SQL Server.SharePoint 等预配虚拟机 ...