WebApi 接口参数:实体类型
实体作为参数
1、前端调用代码
var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }; $.ajax({ type: "post", url: "http://localhost:27221/api/Charging/SaveData", contentType: 'application/json', data: JSON.stringify(postdata), success: function (data, status) {} });
2、后端代码
1 2 3 4 5 | [HttpPost] public bool SaveData(TB_CHARGING oData) { return true ; } |
3、得到结果
成功接收。
注意 如果将前端的代码做点略改动就不会成功。更改代码:
var postdata = "{ ID: \"1\", NAME: \"Jim\", CREATETIME: \"1988-09-11\" }"; $.ajax({ type: "post", url: "http://localhost:27221/api/Charging/SaveData", contentType: 'application/json', data: JSON.stringify(postdata), success: function (data, status) {} });
两次的前端代码在语法和执行上没有任何问题,也能成功的调用后台的API,但接收的参数实体为Null,无法成功,为何呢?两者代码有什么区别呢,经过仔细的检查发现的唯一的差别为Json字符串变量上,前一个变量为:
var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" };
而后一个变量为:
var postdata = "{ ID: \"1\", NAME: \"Jim\", CREATETIME: \"1988-09-11\" }";
两者的区别为:后者增加了一个双引号。不知这是为何???? 一直不明白原因,有谁知原因者请求解答下,谢谢。
将前端代码再修改成:
var postdata = { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }; $.ajax({ type: "post", url: "http://localhost:27221/api/Charging/SaveData", contentType: 'application/json', data: postdata, success: function (data, status) {} });
此时一样是不成功的。为何? 原理解释:使用实体作为参数的时候,前端直接传递普通json,后台直接使用对应的类型去接收即可,不用FromBody。但是这里需要注意的一点就是,这里不能指定contentType为appplication/json,否则,参数无法传递到后台。我们来看看它默认的contentType是什么:
http的Content-Type的类型。看到如下说明:
- application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式);
- application/json : JSON数据格式
也就是说post请求默认是将表单里面的数据的key/value形式发送到服务,而我们的服务器只需要有对应的key/value属性值的对象就可以接收到。而如果使用application/json,则表示将前端的数据以序列化过的json传递到后端(JSON.stringify(postdata)序列化json),后端要把它变成实体对象,还需要一个反序列化的过程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!