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/json
或 text/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的主要内容,如果未能解决你的问题,请参考以下文章