WebApi接口 - 响应输出xml和json

格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况;希望大家喜欢,也希望各位多多扫码支持和点赞谢谢:

. 自定义一个Action,响应输出集合数据

. api返回json数据的两种方式

. json时间格式处理方式

. 让api接口支持返回json和xml数据

下面一步一个脚印的来分享:

. 自定义一个Action,响应输出集合数据

首先,我们新建一个webapi项目,新建好以后我们能够找到 Controllers/ValuesController.cs 文件,查看里面有自动生成的一些代码,我们先不管;然后我们创建一个学生 MoStudent 类,属性代码如:

 1 public class MoStudent
 2     {
 3         public DateTime Birthday { get; set; }
 4
 5         public int Id { get; set; }
 6
 7         public string Name { get; set; }
 8
 9         public bool Sex { get; set; }
11     }

然后我们在 ValuesController 中初始化一些公共的数据,代码如:

1  public List<MoStudent> students = new List<MoStudent>() {
2
3              new MoStudent{ Id =1 , Name ="小1", Sex = true, Birthday= Convert.ToDateTime("1991-05-31")},
4              new MoStudent{ Id =2 , Name ="小2", Sex = false, Birthday= Convert.ToDateTime("1991-05-31")},
5              new MoStudent{ Id =3 , Name ="小3", Sex = false, Birthday= Convert.ToDateTime("1991-05-31")},
6              new MoStudent{ Id =4 , Name ="小4", Sex = true, Birthday= Convert.ToDateTime("1991-05-31")}
7         };

再来,我们新创建一个 GetAllStudents01() 方法,并输出学生集合数据,代码如:

1  public List<MoStudent> GetAllStudents01()
2         {
3             return students;
4         }

这个时候我们生成一下项目,然后在浏览器访问下地址为: http://localhost:1001/api/values ,此时会提示一个错误信息:

这个错误信息是该地址同时匹配上了两个api的Action,分别为 Get()和GetAllStudents01() 两个方法,这种错误我们应该怎么处理呢;一种可以删除其中一个方法;二种方式是在默认路由设置下Action,然后通过具体的Controller/Action地址来访问;三种是通过Route修改下对应的访问路由(这种方法前面一篇文章已经有说明);这里我们就使用第二种,先来修改下 WebApiConfig.cs 文件中默认路由的配置,修改后的配置如:

1 config.Routes.MapHttpRoute(
2                 name: "DefaultApi",
3                 routeTemplate: "api/{controller}/{action}/{id}",
4                 defaults: new { id = RouteParameter.Optional }
5             );

生成后,我们在浏览器中这样访问: http://localhost:1001/api/values/GetAllStudents01 ,GetAllStudents01是对应要访问的Action名称,不出意外我们能在浏览器中看到如下结果:

webapi能正常返回数据了,但是地址感觉好长的样子,不利于我们测试,那么下么我们使用上一篇文章用到的标记RoutePrefixRoute来变动下路由,增加的代码如:

然后我们测试访问下该地址: http://localhost:1001/s/all01 能正常返回如上面的截图数据;

. api返回json数据的两种方式

首先,我们回顾下看下上面节点例子的截图,接口响应输出的是xml格式的数据,这里默认采用的是webapi自带的xml格式化方式,把 Student 属性全部展示了出来,我们真实开发接口的时候,通常会有些对象的属性不会展示,下面我们通过增加 DataContract 和 DataMember 来设置把不需要暴露的属性“隐藏掉”,我们先来看先增加了这两个标记后的Student实体:

 1 [DataContract]
 2     public class MoStudent
 3     {
 4         [DataMember]
 5         public DateTime Birthday { get; set; }
 6
 7         [DataMember]
 8         public int Id { get; set; }
 9
10         [DataMember]
11         public string Name { get; set; }
12
13         [DataMember]
14         public bool Sex { get; set; }
15
16     }

然后咋们运行下程序,在页面看到的结果信息和之前的结果一模一样:

下面把 Birthday 属性上面的 DataMember 去掉,然后再来运行查看结果:

可以看到输出的结果中已经没有了这个 Birthday ,这里能看出的结果是如果未标记 DataMember ,那么是不会输出来的;我们再来看一个有用的东西,先吧Birthday的DataMember回复,然后修改成如下代码:

 1 [DataContract]
 2     public class MoStudent
 3     {
 4         [DataMember(Order = 3)]
 5         public DateTime Birthday { get; set; }
 6
 7         [DataMember(Order = 0)]
 8         public int Id { get; set; }
 9
10         [DataMember(Order = 1)]
11         public string Name { get; set; }
12
13         [DataMember(Order = 2)]
14         public bool Sex { get; set; }
15
16     }

然后咋们再运行起来看效果图:

相信仔细的朋友能够发现,此时Birthday数据暂时的位置已经从第一个变到了最后一个,没错这就是DataMember中Order属性参数的效果:用来指定显示输出数据的位置;

好了咋们来看正题,webapi返回json数据这里讲解两种,一种是使用自带的Json格式化方式,使用方法只需要在 Global.asax.cs 文件中清除一下默认的xml输出方式即可,代码如:

1 var format = GlobalConfiguration.Configuration.Formatters;
2             //清除默认xml
3             format.XmlFormatter.SupportedMediaTypes.Clear();

因为webapi在启动的时候,默认格式化数据有两种方式xml和json,而xml是其默认的启动方式,所以这里是需要清除了xml格式化,那么另外只剩下json,所以咋们在运行程序后能看到这样的结果输出:

结果返回了json数据,如果咋们想要如上面xml一样吧Birthday隐藏掉,我们同样也可以使用 DataContract 和 DataMember 来做这效果,删除Birthday对应的 DataMember 标记后,咋们能看到这样的效果:

同理,我们把Birthday的DataMember还原,然后指定Order属性值 [DataMember(Order=1)] ,这样Birthday显示的位置就变动了:

好了这试第一种json格式化的方式,下面来看下用使用Json.Net怎么来格式化,为了避免影响效果,我们把 Global.asax.cs 文件还原,然后重新增加一个Action方法,代码如:

 1 [Route("all01_1")]
 2         public async Task<HttpResponseMessage> GetAllStudents01_1()
 3         {
 4             var result = await JsonConvert.SerializeObjectAsync(students);
 5
 6             return new HttpResponseMessage
 7             {
 8                 Content = new StringContent(result),
 9                 StatusCode = HttpStatusCode.OK
10             };
11         }

这里用到了Json.Net的 JsonConvert.SerializeObjectAsync 方法来格式化成字符串,然后传递给 HttpResponseMessage ,最终输出的效果和上面一样,好了咋们也来看看这种方式怎么来隐藏不希望接口暴露的属性,这里我们用 JsonIgnore 标记,测试用例在实体类中修改如:

1 [JsonIgnore]
2 public DateTime Birthday { get; set; }

然后运行看一下效果:

我们再来看一下怎么来设置属性的排序,可以使用 JsonProperty(Order = 1) ,实体类修改的代码如下:

 1 public class MoStudent
 2     {
 3         //[DataMember(Order = 1)]
 4         [JsonProperty(Order = 1)]
 5         public DateTime Birthday { get; set; }
 6
 7         //[DataMember(Order = 0)]
 8         [JsonProperty(Order = 0)]
 9         public int Id { get; set; }
10
11         //[DataMember(Order = 1)]
12         [JsonProperty(Order = 1)]
13         public string Name { get; set; }
14
15         //[DataMember(Order = 2)]
16         [JsonProperty(Order = 2)]
17         public bool Sex { get; set; }
18
19     }

能得到和DataMember设置的一样的结果:

. json时间格式处理方式

要说时间格式化,我们通常的生日格式如:yyyy-MM-dd这样,下面也分别对刚才上面两种json化出来的时间做格式化;先来看Json.net,我们先来定义一个名称为 SelfDateTimeFormat 的类并且继承 DateTimeConverterBase 类,然后需要重写 ReadJson和WriteJson ,下面看下这个类的全部方法:

 1  /// <summary>
 2         /// 自定义时间格式化
 3         /// </summary>
 4         public class SelfDateTimeFormat : DateTimeConverterBase
 5         {
 6             public IsoDateTimeConverter TimeConvert = null;
 7
 8             public SelfDateTimeFormat() {
 9
10                 TimeConvert = new IsoDateTimeConverter
11                 {
12                     DateTimeFormat = "yyyy-MM-dd"
13                 };
14             }
15
16             public SelfDateTimeFormat(string formatter = "yyyy-MM-dd HH:mm:ss")
17             {
18
19                 TimeConvert = new IsoDateTimeConverter
20                 {
21                     DateTimeFormat = formatter
22                 };
23             }
24
25             public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
26             {
27
28                 return TimeConvert.ReadJson(reader, objectType, existingValue, serializer);
29             }
30
31             public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
32             {
33
34                 TimeConvert.WriteJson(writer, value, serializer);
35             }
36         }

然后我们需要在实体类的时间属性上增加这样的标记: [JsonConverter(typeof(OverridClass.SelfDateTimeFormat))] ,这里的 SelfDateTimeFormat 就是咋们刚才定义的自定义格式化时间类,我们来看一下输出的效果数据:

好了,咋们再来看webapi自带的json格式化如何定义一个日期格式的数据,我们需要在Global.asax.cs中增加如下代码:

1 var format = GlobalConfiguration.Configuration.Formatters;
2             format.JsonFormatter.SerializerSettings.DateFormatString = "yyyy.MM.dd";

没错,只需要如此简单的代码,即可时间格式化成:

. 让api接口支持返回json和xml数据

开篇第一小节已经有简单说明webapi有自己的json和xml格式化处理,这里们来设置通过参数请求返回不同的数据格式;首先还是需要在Global中设置如下代码:

1  var format = GlobalConfiguration.Configuration.Formatters;
2             format.JsonFormatter.SerializerSettings.DateFormatString = "yyyy.MM.dd";
3
4             //清除默认xml
5             format.XmlFormatter.SupportedMediaTypes.Clear();
6
7             //通过参数设置返回格式
8             format.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "json", "application/json"));
9             format.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("t", "xml", "application/xml"));

这里用到了 QueryStringMapping 类,并传递给他构造函数的参数 new QueryStringMapping("t", "json", "application/json") 和 new QueryStringMapping("t", "xml", "application/xml") 这样就分别对用了json和xml,而前面的“t”表示请求的url地址中参数名称t,下面我们分别来测试下两种请求的参数,地址分别为:

http://localhost:1001/s/all01?t=xml

http://localhost:1001/s/all01?t=json

好了,本篇的内容就和大家分享到这里,例子个人感觉很接近实际常用,如果可以希望您点个赞,谢谢。

时间: 2024-12-16 12:13:32

WebApi接口 - 响应输出xml和json的相关文章

WebApi接口 - 如何在应用中调用webapi接口

简单做个webapi(查询+添加)接口 首先,我们需要有一个webapi接口项目,我这里以前面WebApi接口 - 响应输出xml和json文章的项目来构建本篇文章的测试用例:这里新建一个 DbData 数据源类,主要用来做数据存储和提供查询列表数据及添加数据方法,具体代码如:  1 public class DbData 2     { 3         public static DbData Current 4         { 5             get 6         

SpringBoot RestController 同时支持返回xml和json格式数据

@RestController 默认支持返回json格式数据,即使不做任何配置也能返回json数据 当接口需要支持xml或json两种格式数据时应该怎么做呢? 只要引入 Jackson xml的 maven依赖就可以了: <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-xml-provider</artifactId> &l

两种接口传送数据协议(xml和json)

规范性接口开发中,一般数据是以json或者xml的格式传送的,而不是字符串的形式直接返回给接口调用者:下面介绍这两种格式的编写方法. 下面两种数据传送方式是接口输出端的编写.需引入的包如下: <span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.io.PrintWriter; importjava.io.StringWriter; importjavax.servlet.http.HttpServ

PHP接口数据的封装XML和JSON

使用PHP开发app后端的接口时,我们需要返回数据,最常用的就是XML和JSON格式的数据,那么样返回呢? 1.JSON json数据是最容制造的,只要使用php自带的json_encode()函数就可以简单的制作出json数据了 2.XML xml数据就要复杂一点了,让我们看一下xml数据的格式 那么怎样构造呢? 3.制作生产接口数据的类 <?php //定义生成接口数据类 class Api { /* * 生成json数据格式 * @param integer $code 状态码 * @pa

php xml和json数据产生接口

<span style="font-size:18px;">/** * 返回结果集 * * @param mixed $info 返回的有效数据集或是错误说明 * @param string $msg 为空或是错误类型代号 * @param string $result 请求成功或是失败的标识 * @param int $post 1为xml方式,2为json方式 * */ function getData($info, $msg = '', $post, $result

如何使用程序调用webApi接口

如何使用程序调用webApi接口 在C#中,传统调用HTTP接口一般有两种办法: WebRequest/WebResponse组合的方法调用 WebClient类进行调用. 第一种方法抽象程度较低,使用较为繁琐:而WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,在Web API发布的同时,.NET提供了两个程序集:System.Net.Http和System.Net.Http.Formatting.这两个程序集中最核心的类是Htt

C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult HttpResponseMessage 自定义类型 此篇就围绕这四块分别来看看它们的使用. 一.void无返回值 void关键字我们都不陌生,它申明方法没有返回值.它的使用也很简单,我们来看一个示例就能明白. public class ORDER { publi

[转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义IHttpActionResult接口的实现 三.HttpResponseMessage 四.自定义类型 五.总结 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学

WebApi 接口返回值不困惑:返回值类型详解。IHttpActionResult、void、HttpResponseMessage、自定义类型

首先声明,我还没有这么强大的功底,只是感觉博主写的很好,就做了一个复制,请别因为这个鄙视我,博主网址:http://www.cnblogs.com/landeanfen/p/5501487.html 使用过Webapi的园友应该都知道,Webapi的接口返回值主要有四种类型 void无返回值 IHttpActionResult     (需要MVC高版本才会支持,VS2012/2013不支持,请升级DLL文件或者到VS2015开发环境) HttpResponseMessage 自定义类型 此篇就