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、后端代码
[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),后端要把它变成实体对象,还需要一个反序列化的过程。