C#Web API基于GET请求的XML或JSON

时间:2014-04-29 13:56:02

标签: c# xml json httpresponse formatter

我的config.Routes设置为:

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

有了这个,我可以使用:

  • localhost:port/api/products - 获取完整的产品清单
  • localhost:port/api/products/# - 获取具有给定ID的单个产品

基于浏览器,我得到了不同的格式(默认情况下,FireFox和Google Chrome中的XML格式以及Internet Explorer中的JSON格式)。

我主要需要JSON,所以最初我添加了:

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

所以我的回答总是在JSON中。

此时所有内容都是有意义的,我正在对上面提到的两个GET请求进行JSON格式的响应。


然后我偶然发现this stackoverflow post。 认为根据GET请求为您自己选择要返回的格式是一个很好的功能。

但是,当我替换上面提到的config.Routes和JSON-only代码时:

config.Routes.MapHttpRoute(
    name: "API UriPathExtentsion",
    routeTemplate: "api/{controller}.{ext}/{id}",
    defaults: new { id = RouteParameter.Optional, ext = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
    name: "API UriPathExtension ID",
    routeTemplate: "api/{controller}/{id}.{ext}",
    defaults: new { id = RouteParameter.Optional, ext = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.AddUriPathExtensionMapping("json", "application/json");
config.Formatters.XmlFormatter.AddUriPathExtensionMapping("xml", "text/xml");

我收到以下404错误:

localhost:post/api/products上: enter image description here

并在localhost:port/api/products.xml上: enter image description here

任何人都知道可能出现的问题?

另外,我不确定第二段代码是否会按照我的意愿完成,所以这里是一个示例请求列表以及我希望它返回的内容:

  • localhost:port\api\products - 以默认浏览器格式获取产品列表
  • localhost:port\api\products\# - 以默认浏览器格式获取单个产品
  • localhost:port\api\products.xml - 获取XML格式的产品列表
  • localhost:port\api\products.json - 获取JSON格式的产品列表
  • localhost:port\api\products\#.xml - 以XML格式获取单个产品
  • localhost:port\api\products\#.json - 以JSON格式获取单个产品

提前感谢您的回复。


修改1:在评论后将exten更改为ext。仍然是同样的错误..

1 个答案:

答案 0 :(得分:3)

您链接的帖子说:

  

请记住,在此示例中,您仍然必须使用适当的内容类型发出请求。

这意味着,无论谁调用您的API,都需要将内容类型设置为与application/jsontext/xml匹配。如果您使用浏览器进行呼叫,则您的内容类型将是您正在使用的浏览器的默认内容类型,可能很容易text/plain

选项1: Google,了解如何更改所使用的浏览器的内容类型。我自己从未试图改变这一点。

选项2 :如果您从代码中调用此内容并使用C#,请使用HttpClient并在调用之前修改内容类型,如this StackOverflow post中所述。

选项3 :使用Fiddler (free)中的作曲家来呼叫您的服务。在那里很容易设置内容类型。在测试Web API时我更喜欢这个。

当这一切都说完了,我不确定这实际上能解决你的问题,但我希望如此。至少你跟随你链接的帖子说的所有内容。祝你好运!