【问题标题】:C# Web API Either XML or JSON based on GET requestC# Web API 基于 GET 请求的 XML 或 JSON
【发布时间】:2014-06-15 12:20:58
【问题描述】:

我的 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 代码替换为:

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:

localhost:port/api/products.xml 上:

有谁知道可能出了什么问题?

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

  • 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。还是一样的错误..

【问题讨论】:

  • 您链接到的帖子中的答案包括this comment...这有帮助吗?
  • @DaveParsons 不是真的,因为我已经使用 exten 而不是 extension,如我的主帖代码所示。
  • 评论说使用{ext}而不是{exten}
  • @DaveParsons 我现在已将其更改为{ext},但仍然是相同的错误..
  • 另外,从您的链接帖子中:请记住,在此示例中,您仍然必须使用适当的内容类型发出请求。您这样做了吗?

标签: c# xml json httpresponse formatter


【解决方案1】:

你链接到的帖子说:

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

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

选项 1: Google 并了解如何更改您正在使用的浏览器的内容类型。我从来没有尝试过自己改变这一点。

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

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

说完这一切后,我不确定这是否真的能解决您的问题,但我希望如此。至少你会遵循你链接到的帖子所说的一切。祝你好运!

【讨论】:

  • +1 - 还有一个选项是用于 google chrome 的 Advanced Rest Client,它允许您显式设置所有标题,并很好地格式化 JSON 结果。
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2023-03-09
  • 2022-01-05
  • 2022-12-05
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多