【问题标题】:How is the output format encoded in a RESTful URL?RESTful URL 中的输出格式是如何编码的?
【发布时间】:2011-09-13 04:51:02
【问题描述】:

假设我有一个 RESTful Web 服务,它包含有关可以通过像 http://example.com/myobject 这样的 URL 访问的对象的信息。我希望能够以两种格式检索此信息:首先,XML 格式的纯数据,其次,作为完整的 HTML 页面,其中可能还包括一个 javascript 接口来更改对象并使用 AJAX 将其放回。

实现这一目标的规范方法是什么?我应该在http://example.com/myobject?format=xml 和...format=html 等两个不同的网址上发布我的对象吗? (有没有比在这里使用查询字符串来区分 URL 更好的方法?)或者发送多部分 MIME 数据之类的东西是否明智,我可以依靠浏览器来提取 HTML 部分吗?或者请求中是否有一些我可以使用的 HTTP 标头字段?

(使用不同格式发送的 PUT 或 POST 请求,服务器可以检查格式并进行相应的解析。)

【问题讨论】:

    标签: html http url rest


    【解决方案1】:

    您也可以使用content negotiation 代替查询字符串参数。简而言之,客户端通过请求中的Accept header 发送可接受的媒体类型(例如“application/xml, text/html;q=0.9”),服务器对此进行分析并回复客户端首选的媒体类型(这个过程叫做server-driven negotiation

    在进行服务器驱动协商时,响应应包含Vary header,指示协商中使用的请求标头

    请记住,要使其正常工作,客户端必须发送适当的 Accept 标头。

    【讨论】:

    • 感谢带有 Accept 标头的提示。现在我一直在阅读浏览器如何设置接受标头。唯一剩下的问题似乎是浏览器似乎在 Accept 标头中放置了许多 mime 类型。但是,似乎总是使用 q=1 请求 text/html,这使得它有些可靠。
    • @Marc:你会感到惊讶。 Chrome(版本
    • 这里是浏览器接受标头的小调查(欢迎添加更多):spreadsheets.google.com/spreadsheet/…
    【解决方案2】:

    碰巧很容易阅读的一种方法是只使用扩展:

    http://example.com/myobject.html
    http://example.com/myobject.xml
    http://example.com/myobject.json
    etc.
    

    否则,您可以使用请求接受的内容类型,您可以在请求标头中找到它,例如text/html 用于 HTML,text/xml 用于 XML,text/json 用于 JSON,等等。这叫Content Negotiation

    内容协商是 HTTP 规范中定义的一种机制,它可以在同一个 URI 上提供文档的不同版本(或更一般地,资源),以便用户代理可以指定哪个版本最适合他们的能力。

    这将使您的 URL 非常简单,并且您可以在没有指定其他内容时提供 HTML 输出(并且通过浏览器访问该页面)。

    【讨论】:

    • 使用后缀似乎是最简单的方法,但它不会与一个 RESTful 原则相矛盾,即 URL 应该指向资源而不是输出它的方式吗? (我知道我的 "...?format=xml" 想法在这方面并不好...)
    • 是的,这当然是对的。这就是我添加内容协商的原因,但@Mauricio 也有,所以,你准备好了:)
    • @Marc 为不同格式创建三个不同的资源并没有错。 REST 对此没有任何异议。唯一的缺点是它使缓存失效更加棘手。
    【解决方案3】:

    您会发现您需要一个 HTML 页面来管理少量或更多的 XML 资源,而不仅仅是一个。因此,将您的 HTML 表单粘贴在 example.com/stuff,将您的 XML 资源粘贴在 example.com/api/thing、object 等。或者,如果您希望 XML 成为主要导航,请将其粘贴在 example.com/things,等以及您在 example.com/things/manager.html 或类似内容中的 HTML。由于 Firefox 和 Chrome 拥有允许人类用户单击非 HTML 类型的超链接的插件,这变得更加容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 2017-10-25
      • 2012-02-12
      • 1970-01-01
      • 2020-10-06
      • 2017-07-18
      • 1970-01-01
      相关资源
      最近更新 更多