如何在Accept标头不存在时执行内容协商

时间:2015-03-05 01:18:00

标签: rest http rss atom-feed web-standards

我一直致力于standards-based application framework called Maki,旨在将网络上的“资源”隔离到单个网址。但是,我发现很多HTTP客户端都没有提供足够的信息,特别是在Content Negotiation的上下文中。

例如,a podcast hosted using this framework期望在/shows处提供“显示”集合,并且它将根据传入请求以适当格式化的内容进行响应。例如,accessing the page with a web browser呈现剧集的HTML列表,而当客户端指定它需要XML时,相同的URL将返回Atom订阅源:

$ curl -H "Accept: application/xml" https://decentralize.fm/shows
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cc="http://web.resource.org/cc/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <channel>
  ...
  </channel>
</rss>

但是,我注意到许多(大多数!)HTTP客户端(包括iTunes)上的标头不会发送Accept标头,在这种特殊情况下需要XML响应。那是为什么?

除了提供新URL以提供相同资源的XML格式版本之外,还有哪些替代方法可以确定如何格式化响应?

1 个答案:

答案 0 :(得分:1)

我将构建的核心概念,即我的观点的焦点,是格言&#34;了解您的受众。&#34;您的基本响应(您的最后结果)应该是您的主要受众期望的内容,无论您想要提供什么。因此,如果访问此URL的最大群体是itunes客户端,则需要提供itunes友好格式。请记住,您的主要受众群体决定了您应该提供的内容,而不是相反。您不必真正选择观众是谁。您只能将您的内容放在那里并符合他们的要求。

其次,您可以/应该使用您想要的Accept标头。当然还有通过用户代理进行浏览器检测的额外旧学校粗略方法。另一件需要考虑的事情是,如果您尝试基于接受标头向同一客户端提供多种内容类型,那么您实际上会破坏客户端缓存,因为缓存由URL决定。