WebAPI OData $format 到 xml

Posted

技术标签:

【中文标题】WebAPI OData $format 到 xml【英文标题】:WebAPI OData $format to xml 【发布时间】:2014-03-01 16:41:59 【问题描述】:

对于我的 WebAPI OData 应用程序,我试图让我的客户(浏览器)决定数据输出应该是什么格式。由于 $format 尚未在 WebAPI OData 中实现,我在这里使用 Raghuramn 的示例:https://gist.github.com/raghuramn/5556691

var queryParams = request.GetQueryNameValuePairs();
var dollarFormat = queryParams.Where(kvp => kvp.Key == "$format").Select(kvp => kvp.Value).FirstOrDefault();

if (dollarFormat != null)

    request.Headers.Accept.Clear();
    request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(dollarFormat));

    // remove $format from the request.
    request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = queryParams.Where(kvp => kvp.Key != "$format");

这适用于 JSON ($format=application/json;odata=fullmetadata) 和 JSON light (format=application/json;odata=light),但目前不适用于 xml。

如果我将 $format=application/XML 添加到查询字符串,它仍然会输出到 json 灯。我如何强制 XML 输出?

编辑:

即使我在 Fiddler 中通过发送强制 xml 内容类型:application/xml接受:应用程序/xml 对于请求,响应仅列出: 内容类型:应用程序/json; odata=最小元数据;流=真;字符集=utf-8

编辑 2:

Accept: application/atom+xml 似乎确实在原始响应中输出了 xml。不幸的是,“application/atom+xml”在以下位置抛出了 FormatException:

request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/atom+xml"));

【问题讨论】:

你试过text/xml吗? 是的,也输出 json... 仅供参考,当使用 $format=application/atom+xml 查询字符串时,Raghuramn 的示例将失败,因为 DollarFormat 的值将是“application/atom xml”,这是由于 url 中的“+” . 【参考方案1】:

设置请求 ContentType 而不是 AcceptHeader 就可以了:

request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/atom+xml");

【讨论】:

对我不起作用。您能否告诉我您使用哪些版本的 Web API 和 OData 库?我正在使用 Web API 2.2(5.2.2 程序集版本)和 OData lib v. 6.7.0。 您好,@stefjnl - 如果可能的话,我想看看您的客户端代码(例如,如果您使用 jquery 的 ajax 来制定请求......它是什么样的?)【参考方案2】:

感谢对这个问题提出的关键字 request.Headers.Accept.AddMediaTypeWithQualityHeaderValue 的搜索,我找到了一个 CodeProject Article,它实际上提供了正确添加 Accept 标头并解决相同问题的语法:

this.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/atom+xml"));

而不是 MediaTypeWithQualityHeaderValue.Parse("application/atom+xml"),它会抛出 FormatException。

【讨论】:

以上是关于WebAPI OData $format 到 xml的主要内容,如果未能解决你的问题,请参考以下文章

武装你的WEBAPI-OData便捷查询

武装你的WEBAPI-OData便捷查询

武装你的WEBAPI-OData入门

武装你的WEBAPI-OData入门

武装你的WEBAPI-OData资源更新Delta

OData WebAPI 2 复杂授权