.netCore WebApi传输参变化

.netCore 的 WebApi,一般以前的mvc5,继承自 ApiController ,则是WebApi,采用独有的管道处理模型,再Core中,一般是 继承自 ControllerBase,控制器类上标注 [ApiController]

1.前端代码

1  //NetCoreWebApi中,传输 application/json; 格式的,后端无需加[FormBody]也能拿到值
2  $.ajax({
3   type: "post",
4     url: "/api/WebApi/ww",
5     data: JSON.stringify( { a: 1, b: 2,c: 4,"yy":99,"bb":"匹配"} ),  //如果没有序列化,后端获取不到,序列化了,WebApi不需要加 FormBody,能拿到值,contentType: "application/json;charset=utf-8"//不加上 默认不是表单的那种也不是json那种
6      contentType: "application/x-www-form-urlencoded",//这个类型无法指定
7      data: { a: 1, b: 2,c: 4,"yy":99,"bb":"匹配"},
8     })

2.后端代码

 [HttpPost]
[Route("ww")]
 public string Po(KJ k, int yy, string bb)
 {
     //k null
     //yy 0
     //b  null
 }

3.结论:

因为前端指定了,传输类型为,"application/x-www-form-urlencoded",就算不写 contentType,它的默认值也是“application/x-www-form-urlencoded”,但是指定失败

最后的请求格式:application /problem+json; charset=utf-8

报错为:415

解决:指定为 json传输,序列化后传输,后端就可以拿到值 (可以不用[FormBody]),核心都在 传输的 contentType

[HttpPost]
[Route("E3")]
public string fdasfs([BindAttribute(include: "a,b")] [FromBody] KJ p, int r = 0)
{
 //******************.Net Core Mvc WebApi的post的使用**************************/
 //1.前端指定的application/json,传输json数据,不管有没有[FromBody]都可以拿到值
   /*2.前端指定的application/x-www-form-urlencoded,传输json数据或者json对象,失败,
     *明明设置了传输类型,但是却成了 application /problem+json; charset=utf-8,导致请求失败
     3.如果传入的除了一个实体,还有其他参数,那就都绑定不上 都没有拿到值
      前端是这样的:{user: {a: 1, b: 9}, r: 99} 就是不行的,
      {a: 1, b: 9}可行的
       必须整成一个实体
       /* var json = { user: { a: 1, b: 9,  }, r: 99 };
$.ajax({
   url: "/api/mm/E3",
   type: "post",
   //contentType:"application/x-www-form-urlencoded",//写成这种,写了也白写,最终传输类型被覆盖
   contentType:"application/json",
   data:JSON.stringify(json)
}); */
?
/* 4.NetCore的 BindAttribute特性 在  contentType:"application/json 不起作用,不能绑定指定的属性,在
  contentType:"application/x-www-form-urlencoded  表单中完全可以,过滤掉不需要的属性
   FormData
    a:1
    b:9
    */
   return "OK";
}

原文地址:https://www.cnblogs.com/Qintai/p/11829535.html

时间: 2024-10-14 14:02:25

.netCore WebApi传输参变化的相关文章

WebApi传参总动员(一)

目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对WebApi传参做了深入的研(bai)究(du). 正常的WebApi有三种接收参数的方式: 1.以json字符串的形式传入.从请求的输入流获取传入的json字符串,再反序列化成自己需要的实体.利用的是Request.InputStream. 2.以url传参的形式传入.WebApi自动转换成对应的实

C# WebApi传参之Post请求-AJAX

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.  学无止境,精益求精    上一节讲述了C# WebApi传参之Get请求-AJAX 本节讲述C# WebApi传参之Post请求-AJAX,说起Ajax针对webApi的Post请求,真的不敢恭维,确实比较怪异,如果你不幸要写一个Ajax Post请求webApi接口,那么您还是有必要花点时间看看本篇博客,如果你也遇到了同样的问题,就不妨在最后给本篇博客点个赞.谢谢 说

WebApi传参总动员(四)

前文介绍了Form Data 形式传参,本文介绍json传参. WebApi及Model: public class ValuesController : ApiController { [HttpPost] public string GetData(string name,[FromBody]Woman woman) { return "我是" + name + ",我喜欢" + woman.Name; } [HttpPost] public string Ge

.NetCore WebApi —— Swagger版本控制

上接:.NetCore WebApi——基于JWT的简单身份认证与授权(Swagger) 版本控制的好处是显而易见的,利用Swagger展示不同版本的API更能体现效果. 1.安装Nuget包:Microsoft.AspNetCore.Mvc.Versioning 2. 配置Startup类  2.1  添加新成员 ,用来获取API版本信息 /// <summary> /// Api版本信息 /// </summary> private IApiVersionDescription

使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档

一.问题 使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档的方法 二.解决方案 参考文章:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swagger?tabs=visual-studio 1.Install-Package Swashbuckle.AspNetCore 2.在ConfigureServices中添加AddSwaggerGe

解决WebApi入参时多对象的问题

我们的项目是用WebApi提供数据服务,且WebPage跟APP中都有调用到. WebApi提供的接口一多,就发现一个问题,我们项目中有很多接口是接收POST(安全原因,我们采用的是https)请求的,而且入参基本也就是一两个参数.在开发的后期发现WebApi中有很多对象,多到已经快到了难以管理的地步了. 比如我们的WebApi如下: 对应的入参对象是: 很难想象如果再有别的Controller的话,Models中会有多少对象,而这些对象往往使用一次,或者在一个方法中使用了一下就不再用了. 这显

WebApi传参总动员(五)

上回说到涉及多个实体的传参,用常规的方法已经不能解决了.这回我们用终极大招搞定她. WebApi:注意要引用JSON.Net [HttpPost] public string GetData(string name,JObject obj) { dynamic json = obj; //获得动态对象 JObject womanJson = json.woman; //获取动态对象中子对象 JObject sonJson = json.son; var woman = womanJson.ToO

WebApi传参总动员(三)

上篇介绍了如何从输入流中获取实体对象.本篇介绍以url形式传递参数.简单的参数不再赘述,这里主要实现形如(string name,Woman woman)这样的参数传递. 本篇及后面几章均涉及js调用及C#调用,而且篇幅较长,请大家见谅. 一.js调用. WebApi: public class ValuesController : ApiController { [HttpPost] public string GetData(string name,Woman woman) { return

WebApi传参总动员(填坑)

本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和WebAPI之间的一个关键不同点在于MVC缓存请求主体(request body).这意味着MVC的参数绑定可以反复从body中查找参数片断.然而,在WebAPI中,请求主体(HttpContent) 只能被读取一次,不被缓存,只能向前读取的流.这意味着parameter binding需要谨慎对待s