[英]C# Web API Either XML or JSON based on GET request
我的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格式的响应。
然后我偶然发现了这个stackoverflow帖子 。 认为根据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
:
在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
。 还是一样的错误..
你链接的帖子说:
请记住,在此示例中,您仍然必须使用适当的内容类型发出请求。
这意味着无论谁调用您的API,都需要将content-type设置为匹配application/json
或text/xml
。 如果您使用浏览器进行呼叫,则您的内容类型将是您正在使用的浏览器的默认内容类型,这可能很容易为text/plain
。
选项1: Google并了解如何更改您正在使用的浏览器的内容类型。 我自己从未试图改变这一点。
选项2:如果您从代码中调用此函数并使用C#,请使用HttpClient
并在调用之前修改内容类型, 如此StackOverflow帖子中所述 。
选项3:使用Fiddler中的作曲家(免费)来呼叫您的服务。 在那里很容易设置内容类型。 在测试Web API时我更喜欢这个。
当所有这些都说完了,我不确定这实际上解决了你的问题,但我希望如此。 至少你跟随你链接的帖子说的所有内容。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.