.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"; }