博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webapi 获取json数据
阅读量:5235 次
发布时间:2019-06-14

本文共 5712 字,大约阅读时间需要 19 分钟。

一般的我们可以直接使用参数来接受,这个就不多介绍了

[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("嘻嘻嘻");        }        ///         /// 返回强类型        ///         ///         /// 
[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字符串:

 

 

正解:普通的两种使用方式

     ///         /// 如果没有定义Dto类型        ///         /// json数据        /// 
[HttpPost] public IHttpActionResult Test3([FromBody]object json) { JObject @object = JObject.Parse(json.ToString()); return Ok(@object); } /// /// 定义了Dto类型 /// /// /// 根据json 定义的类 /// ///
[HttpPost] public IHttpActionResult Test4(ToiletInfoInDto inDto) { // CommonOutDto 为自定义的返回类 CommonOutDto outDto = new CommonOutDto(); outDto.dataStr = "请求成功"; outDto.errcode = 0; return Ok(outDto); }

 

ToiletInfoInDto :
///     /// 厕所信息    ///     public class ToiletInfoInDto    {        ///         /// 厕所编号        ///         public string CsNum { get; set; }        ///         /// 厕所名称        ///         public string CsName { get; set; }        ///         /// 百度经度        ///         public string CoordX { get; set; }        ///         /// 百度纬度        ///         public string CoordY { get; set; }             ///         /// 厕所等级        ///         public string Rank { get; set; }         }
View Code
CommonOutDto:
///     /// 返回公共类    ///     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();

 

推荐:使用异步的方式

 

///         /// 使用objct接受        ///         ///         /// 
[HttpPost] public async Task
TestAsync([FromBody]object json) { JObject @object = JObject.Parse(json.ToString()); return await Task.FromResult
(Ok(@object)); } ///
/// 使用强类型接受 /// ///
///
[HttpPost] public async Task
TestAsync2(ToiletInfoInDto inDto) { return await Task.FromResult
(Ok(inDto)); } ///
/// 使用读取数据的方式 /// ///
[HttpPost] public async Task
TestAsync3() { string aa = await this.Request.Content.ReadAsStringAsync(); return await Task.FromResult
(Ok(aa)); } ///
/// 使用强类型接受,返回强类型 推荐这种,输入,输出都新建一个对应的Dto进行处理 /// ///
输入类 ///
输出类
[HttpPost] public async Task
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来用。

 

转载于:https://www.cnblogs.com/Sea1ee/p/10438838.html

你可能感兴趣的文章
python——函数和过程的区别
查看>>
C语言深度学习——第一天
查看>>
Android 导航(介绍)页面ViewPager内存溢出解决方法
查看>>
检测php网站是否已经被攻破的方法
查看>>
经验总结 - 20111115
查看>>
(servlet页面跳转没有反应)
查看>>
JDK安装与环境变量配置
查看>>
【动态规划】skiing
查看>>
USB2.0的鸡血补丁
查看>>
java定时器的使用(Timer)
查看>>
Cocos2d-x官方在线视频-Cocos2d-x3.2《2048》手游开发揭秘
查看>>
转载---SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除...
查看>>
[转载]马士兵Java视频教程 —— 学习顺序
查看>>
合唱队(华为OJ)
查看>>
Reverse Words in a String III
查看>>
静态页面复习--用semantic UI+网格+卡片实现图片布局
查看>>
数据库交互之减少IO次数
查看>>
8天玩转并行开发——第一天 Parallel的使用
查看>>
Http通讯协议在.net下的实现方法
查看>>
leaflet与ECharts的统计图表
查看>>