在web api 中后台的方法必须 加入 [HttpGet] ,[HttpPost],[HttpPut],[HttpDelete] 来区分,这是一种习惯。
ps: get 方式参数都存在http协议头中( 请求头 ) ,post 参数存在http协议包的包体中( 请求体 )
1. HttpGet
a. 前端默认以json对象进行数据传输,后台方法参数给出一一对应名称
b. 前端将对象以json序列化参数传输json:{data: JSON.stringify({Id:1,Name:"dd"})}
c.后台参数对对象进行标记 [FromUri]
[HttpGet]
public string GetAllChargingData([FromUri]TB_CHARGING obj)
一般来说get 请求如果是基础类型传值, 传参直接在方法中定义,请求传输参数是 实体,先将实体进行json序列化,后台进行json反序列化得到值,如下面的标准写法
前端
$.ajax({ type: "get", url: "http://localhost:27221/api/Charging/GetByModel", contentType: "application/json", data: { strQuery: JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" }) }, success: function (data, status) { if (status == "success") { $("#div_test").html(data); } } });
后端
[HttpGet]
public string GetByModel(string strQuery) { TB_CHARGING oData = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_CHARGING>(strQuery); return "ChargingData" + oData.ID; }
为什么要加入[HttpGet],当你后台的方法如果是Get开头时,加不加没关系,如果是query或者find之类开头的方法,则会找不到。
2.HttpPost
a. 基础类型参数, 前端 data: {"":"张三"}, 后端 SaveName([FormBody]string Name),如果是多个参数需要进行json序列化 JSON.stringify({ NAME: "Jim",DES:"备注" }),后端用dynamic类型解决 SaveName (dynamic obj) obj.Name,这种方式极不爽
b. 实体类型参数, 前端 直接普通json类型,无需序列化,后台参数直接相应实体类型接收
c. 实体类型,基础类型都有或者实体集合,前端都需要进行序列化转换 ,不同的是 含有基础类型的,后台参数用动态类型,
ps:
1.普通json类型是 data: { ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" } ,json序列化是 JSON.stringify({ ID: "1", NAME: "Jim", CREATETIME: "1988-09-11" })
2.使用实体作为参数的时候,前端直接传递普通json,后台直接使用对应的类型去接收即可,不用FromBody。但是这里需要注意的一点就是,这里不能指定contentType为appplication/json,否则,参数无法传递到后台。form表单数据被编码为key/value格式发送到服务器
3.前端请求参数 ContentType ,返回参数类型 data-type