webapi 獲取json數據


一般的我們可以直接使用參數來接受,這個就不多介紹了

    [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; }     
    }
View Code
CommonOutDto:
  /// <summary>
    /// 返回公共類
    /// </summary>
    public class CommonOutDto
    {
        public int errcode { get; set; }

        public string dataStr { get; set; }

        public string errmsgStr { get; set; }
    }
View Code

 

 

 

 ③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來用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM