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

Posted

技术标签:

【中文标题】C# Web API 基于 GET 请求的 XML 或 JSON【英文标题】:C# Web API Either XML or JSON based on GET request 【发布时间】: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 *** 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,但仍然是相同的错误.. 另外,从您的链接帖子中:请记住,在此示例中,您仍然必须使用适当的内容类型发出请求。您这样做了吗? 【参考方案1】:

你链接到的帖子说:

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

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

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

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

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

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

【讨论】:

+1 - 还有一个选项是用于 google chrome 的 Advanced Rest Client,它允许您显式设置所有标题,并很好地格式化 JSON 结果。

以上是关于C# Web API 基于 GET 请求的 XML 或 JSON的主要内容,如果未能解决你的问题,请参考以下文章

带有多个逗号分隔参数的C# Web API GET [关闭]。

C# 关于Web service + XML接口开发

Web API 接口规范

c# webapi post多个参数

如何与 Web XML/JSON API 交互?

从 ASP Net Web API POST 请求中删除空的 xml 标记