如何强制ASP.NET Web API根据我的input返回JSON或XML数据?
我尝试根据input获取输出的XML或JSON数据。 我使用了下面的WEB API代码,但不能精确输出。
public string Get(int id) { if (GlobalConfiguration.Configuration.Formatters.XmlFormatter == null) { GlobalConfiguration.Configuration.Formatters.Add(GlobalConfiguration.Configuration.Formatters.XmlFormatter); } if (GlobalConfiguration.Configuration.Formatters.JsonFormatter == null) { GlobalConfiguration.Configuration.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter); } if (id == 1) { GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter); GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true; } else { GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); GlobalConfiguration.Configuration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true; } return "value"; }
在global.asax
文件中添加下面的代码app_start
事件。 在API Url中添加查询string:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "json", new MediaTypeHeaderValue("application/json"))); GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add( new QueryStringMapping("type", "xml", new MediaTypeHeaderValue("application/xml")));
例如:
for xml : http://localhost:49533/api/?type=xml for json: http://localhost:49533/api/?type=json
你正在尝试做什么将不会在multithreading环境中工作。 您无法在每个请求的基础上添加或删除格式化程序集。 这是完成你想要的更好的方法。
public HttpResponseMessage Get(int id) { Foo foo = new Foo(); var content = new ObjectContent<Foo>(foo, ((id == 1) ? Configuration.Formatters.XmlFormatter : Configuration.Formatters.JsonFormatter)); return new HttpResponseMessage() { Content = content }; }
仔细看了一下,在另一个post里find了你的答案:
public HttpResponseMessage Get(int id) { string content = "value"; if (id == 1) { return Request.CreateResponse<string>(HttpStatusCode.OK, content, Configuration.Formatters.JsonFormatter); } return Request.CreateResponse<string>(HttpStatusCode.OK, content, Configuration.Formatters.XmlFormatter); }
它也可以强制接受头文件。 好的select,如果你不总是返回HttpResponseMessage's
。 即
Request.Headers.Add("Accept", "text/json"); return Request.CreateResponse(HttpStatusCode.OK, yourobject);
要么
Request.Headers.Add("Accept", "application/xml"); return new Rss20FeedFormatter(feed);
如果您的请求指定了MIMEtypes,例如application/json
,那么web API将适当地格式化响应。
如果您试图手动debugging您的web api,请使用像Fiddler 2这样的工具来指定types。
本文介绍了这个概念。
尽pipevijayjan15接受的答案似乎是针对具体情况(即使用MediaTypeMappings)的最佳方式,但也可以使用两种不同的方法,一种是返回XML,另一种是返回JSON。 为此,可以实例化一个特定于控制器的HttpConfiguration(以避免修改GlobalConfiguration.Configuration中的一个):
public MyReturnType GetMyTypeAsXml() { Configuration = new HttpConfiguration(); Configuration.Formatters.Clear(); Configuration.Formatters.Add(new XmlMediaTypeFormatter()); return new MyReturnType(); } public MyReturnType GetMyTypeAsJson() { Configuration = new HttpConfiguration(); Configuration.Formatters.Clear(); Configuration.Formatters.Add(new JsonMediaTypeFormatter()); return new MyReturnType(); }
我不确定在启动HttpConfiguration的一个新实例时有多less开销(我怀疑不是很多),但是新实例带有默认填充的Formatters集合,这就是为什么你必须在实例化之后清除它它。 请注意,如果您不使用Configuration = new HttpConfiguration(),而直接修改configuration,它会修改GlobalConfiguration.Configuration属性(所以,它会影响您所有其他WebApi方法 – 不好!)。
QueryStringMapping`是很好的解决scheme,但我需要一个types的默认值。
对于xml: localhost:49533/api/?type=xml
对于json: localhost:49533/api/
我解决了这样的情况:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); var jSettings = new JsonSerializerSettings(); GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings; GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", new MediaTypeHeaderValue("application/xml")));