79

我正在研究一种宁静的设计,并希望尽可能多地使用 HTTP 方法 ( POST, GET, ...) 和 HTTP 标头。我已经发现浏览器不支持 HTTPPUT方法DELETE

现在我正在寻找相同资源的不同表示,并希望通过更改Accept请求的标头来做到这一点。根据此Accept标头,服务器可以为同一资源提供不同的视图。

问题是我没有找到告诉浏览器更改此标头的方法。

<a..>标签有一个type 属性,可以有一个 mime 类型,看起来是一个不错的候选者,但标题仍然是浏览器的默认值(在 Firefox 中,它可以about:config使用network.http.accept.default键进行更改)。

4

5 回答 5

44

我部分不同意 Milan 将请求的表示嵌入 URI 的建议。

如果可能的话,URI 应该用于寻址资源而不是隧道 HTTP 方法/动词。最终,如果仅创建 (POST) 或更新 (PUT) 无法达到目的,则可以将特定的业务操作(编辑、锁定等)嵌入 URI:

发布 http://shonzilla.com/orders/08/165;编辑

在请求 URI 中的特定表示的情况下,您将需要破坏您的 URI 设计,最终使其变得更丑陋,在同一个地方(即 URI)混合两个不同的 REST 概念,并使其更难在服务器端通用处理请求。米兰的建议和许多人都在做同样的事情,包括。Flickr,正是这个。

相反,更 RESTful 的方法是使用单独的位置来编码首选表示,方法是使用AcceptHTTP 标头进行内容协商,其中客户端告诉服务器它可以处理/处理哪些内容类型,服务器尝试满足客户端的请求。这种方法是HTTP 1.1 标准的一部分,软件兼容并受 Web 浏览器支持。

比较一下:

获取 /orders/08/165.xml HTTP/1.1
或者
获取 /orders/08/165&format=xml HTTP/1.1

对此:

GET /orders/08/165 HTTP/1.1
接受:application/xml

在网络浏览器中,您可以使用对象setRequestHeader方法请求任何内容类型XMLHttpRequest。例如:

函数 getOrder(year, yearlyOrderId, contentType) {
 var client = new XMLHttpRequest();
 client.open("GET", "/order/" + year + "/" + yearlyOrderId);
 client.setRequestHeader("接受", contentType);
 client.send(orderDetails);
}

总而言之:地址,即资源的 URI 应该独立于其表示,XMLHttpRequest.setRequestHeader方法允许您使用AcceptHTTP 标头请求任何表示。

干杯!
松兹拉

于 2008-12-29T17:24:28.163 回答
12

我正在寻找完全相同的事情(RESTful Web 服务),我偶然发现了这个 firefox 插件,它可以让您修改请求的接受标头(实际上是任何请求标头)。它完美地工作。

https://addons.mozilla.org/en-US/firefox/addon/967/

于 2010-09-11T16:01:35.133 回答
8

我认为不可能以您尝试的方式进行。

通常通过在资源名称中添加扩展名来指示接受的数据格式。所以,如果你有类似的资源

/resources/resource

GET /resources/resource返回它的 HTML 表示,以表明您想要它的 XML 表示,您可以使用以下模式:

/resources/resource.xml

那么,您必须在服务器端执行公认的内容类型确定魔法。

或者按照 James 的建议使用 Javascript。

于 2008-12-17T15:44:45.007 回答
5

谷歌浏览器的ModHeader扩展,也是一个不错的选择。您可以只设置所需的标题,然后在浏览器中输入 URL,当您点击 url 时,它将自动从扩展中获取标题。唯一的问题是,它会为您将点击的每个 URL 发送标头,因此您必须在使用后禁用或删除它。

于 2018-07-25T12:22:23.130 回答
0

使用一些javascript!

xmlhttp=新的 XMLHttpRequest();
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist)
xmlhttp.send("页面内容放在这里");
于 2008-12-17T15:36:47.160 回答