我有以下代码
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.JsonFormatter.MediaTypeMappings.Add(
new UriPathExtensionMapping("json", "application/json"));
config.Formatters.XmlFormatter.MediaTypeMappings.Add(
new UriPathExtensionMapping("xml", "application/xml"));
现在我想要的是,如果某个人没有像http://apuUrl/getBooks
那样在api中提供扩展,它应该默认返回JSON值。
我的以下方案工作正常:
http://apuUrl/getBooks.json
- >返回JSON
http://apuUrl/getBooks.xml
- >返回XML
注意:我不想为每个API提供额外的路由
答案 0 :(得分:2)
如何使用DelegatingHandler覆盖acceptheader?
public class MediaTypeDelegatingHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var url = request.RequestUri.ToString();
//TODO: Maybe a more elegant check?
if (url.EndsWith(".json"))
{
// clear the accept and replace it to use JSON.
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
else if (url.EndsWith(".xml"))
{
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
}
return await base.SendAsync(request, cancellationToken);
}
}
在您的配置中:
GlobalConfiguration.Configuration.MessageHandlers.Add(new MediaTypeDelegatingHandler());
你的控制器:
public class FooController : ApiController
{
public string Get()
{
return "test";
}
}
如果你去http://yoursite.com/api/Foo/?.json
应该返回:
"test"
http://yoursite.com/api/Foo/?.xml
应该返回
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test</string>
修改强>
请注意,您仍然需要处理路由参数输入,因为控制器并不期望.json参数。这就是为什么?
可能是必要的。