一般的我們可以直接使用參數來接受,這個就不多介紹了
[HttpGet] public IHttpActionResult Test2([FromUri]string name) { object obj = new { name = "sss", age = 78, sex = true }; return Ok(new { errcode = 0, data = obj }); } [HttpPost] public IHttpActionResult Test3([FromBody]string name) { throw new Exception("嘻嘻嘻"); } /// <summary> /// 返回強類型 /// </summary> /// <param name="name"></param> /// <returns></returns> [HttpGet] public CommonOutDto Test4([FromUri]string name) { CommonOutDto outDto = new CommonOutDto(); outDto.errcode = 0; return outDto; }
現在一般使用json來傳遞參數,如果使用強類型,需要我們把類的屬性和參數名設置一樣就可以了。get,post都可以,這里只演示了post請求
①使用參數名來接受,這樣顯示不管你是傳遞json字符串還是json對象都是接收不到的
[HttpPost] public IHttpActionResult Test4([FromBody]string json) { throw new Exception("嘻嘻嘻"); }
②稍微改動下,把參數類型換成objct,這樣我們不管是傳遞json對象和字符串都是能夠接受到的
[HttpPost] public IHttpActionResult Test4([FromBody]object json) { throw new Exception("嘻嘻嘻"); }
json對象;
json字符串:
正解:普通的兩種使用方式
/// <summary> /// 如果沒有定義Dto類型 /// </summary> /// <param name="json">json數據</param> /// <returns></returns> [HttpPost] public IHttpActionResult Test3([FromBody]object json) { JObject @object = JObject.Parse(json.ToString()); return Ok(@object); } /// <summary> /// 定義了Dto類型 /// </summary> /// <param name="inDto"> /// 根據json 定義的類 /// </param> /// <returns></returns> [HttpPost] public IHttpActionResult Test4(ToiletInfoInDto inDto) { // CommonOutDto 為自定義的返回類 CommonOutDto outDto = new CommonOutDto(); outDto.dataStr = "請求成功"; outDto.errcode = 0; return Ok(outDto); }
ToiletInfoInDto :

/// <summary> /// 廁所信息 /// </summary> public class ToiletInfoInDto { /// <summary> /// 廁所編號 /// </summary> public string CsNum { get; set; } /// <summary> /// 廁所名稱 /// </summary> public string CsName { get; set; } /// <summary> /// 百度經度 /// </summary> public string CoordX { get; set; } /// <summary> /// 百度緯度 /// </summary> public string CoordY { get; set; } /// <summary> /// 廁所等級 /// </summary> public string Rank { get; set; } }
CommonOutDto:

/// <summary> /// 返回公共類 /// </summary> public class CommonOutDto { public int errcode { get; set; } public string dataStr { get; set; } public string errmsgStr { get; set; } }
③mvc中也可以寫接口,我們肯定使用過流接受過參數,那webapi中同樣是可以的
mvc中可以直接寫:
string json2 = new StreamReader(Request.InputStream).ReadToEnd();
webapi中沒有 HttpContext這個,我們可以引用進行使用
//引用 using System.Web; string json2 = new StreamReader(HttpContext.Current.Request.InputStream).ReadToEnd();
webapi中我們使用request強制同步獲取數據,顯示獲取不到
//強制同步獲取不到數據 string aa = this.Request.Content.ReadAsStringAsync().GetAwaiter().GetResult();
推薦:使用異步的方式
/// <summary> /// 使用objct接受 /// </summary> /// <param name="json"></param> /// <returns></returns> [HttpPost] public async Task<IHttpActionResult> TestAsync([FromBody]object json) { JObject @object = JObject.Parse(json.ToString()); return await Task.FromResult<IHttpActionResult>(Ok(@object)); } /// <summary> /// 使用強類型接受 /// </summary> /// <param name="inDto"></param> /// <returns></returns> [HttpPost] public async Task<IHttpActionResult> TestAsync2(ToiletInfoInDto inDto) { return await Task.FromResult<IHttpActionResult>(Ok(inDto)); } /// <summary> /// 使用讀取數據的方式 /// </summary> /// <returns></returns> [HttpPost] public async Task<IHttpActionResult> TestAsync3() { string aa = await this.Request.Content.ReadAsStringAsync(); return await Task.FromResult<IHttpActionResult>(Ok(aa)); } /// <summary> /// 使用強類型接受,返回強類型 推薦這種,輸入,輸出都新建一個對應的Dto進行處理 /// </summary> /// <param name="inDto">輸入類</param> /// <returns>輸出類</returns> [HttpPost] public async Task<CommonOutDto> TestAsync4(ToiletInfoInDto inDto) { CommonOutDto outDto = new CommonOutDto(); outDto.errcode = 0; return await Task.FromResult(outDto); }
顯示結果:
可以看到我們的 TestAsync2 接口中,我們的屬性小寫了,這是自己序列化json數據造成的,俗稱:駝峰式。 當然這個是可以設置的,我們在webapiConfig.cs 中可以設置我們的json的屬性
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服務 // Web API 路由 config.MapHttpAttributeRoutes(); //多添加一個action config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); // 干掉XML序列化器 兩種都可以 //GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); config.Formatters.Remove(config.Formatters.XmlFormatter); //配置json數據格式 JsonMediaTypeFormatter jsonFormatter = config.Formatters.JsonFormatter; //忽略循環引用,如果設置為Error,則遇到循環引用的時候報錯(建議設置為Error,這樣更規范) jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Error; //日期格式化,默認的格式也不好看 jsonFormatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; // 對 JSON 數據使用混合大小寫。跟屬性名同樣的大小.輸出 jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver(); //json中屬性開頭字母小寫的駝峰命名 //jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); } }
總結:
1:一般的我們使用Object類型或者強類型來接接收
2:提高效率,我們是異步
題外:我們一般都會准備一個Dto來接受我們的json對象,如果你不想這樣寫,也可以使用JObject來用。