有关正确REST api设计的问题,特别是在更新资源时的PUT操作

时间:2015-02-21 04:06:42

标签: rest http put

我正在创建一个REST接口(我们都不是),我想更新一个资源。

所以,我认为使用PUT。

所以,我读了this

我带走的是我将PUT转换为这样的网址

/hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c

使用有效负载,然后永久重定向到URL,它可以获取资源的更新版本。 在这种情况下,它恰好是相同的URL,不同的操作。

所以我的问题是:

  1. 我是否理解在使用PUT时更新资源是正确的,并且我对PUT使用的理解是正确的。
  2. 当客户端获得重定向时,它是否会对重定向的URL执行与原始URL相同的操作?如果它的"取决于"大多数客户都遵循标准吗?
  3. 我问第二个问题,因为POSTMAN和我的JQuery AJAX调用都在窒息。 JQuery因为net :: ERR_TOO_MANY_REDIRECTS。那么它是否会再次重定向并尝试PUT,它会再次进行REDIRECT?

    curl也会爆炸,但即使它说如果它获得301它将切换到GET,当我查看输出时,它似乎并没有真正做到这一点(下图)。

    当curl跟随重定向并且请求不是普通GET(例如POST或PUT)时,如果HTTP响应是301,302或303,它将使用GET执行以下请求。如果响应代码是任何其他3xx代码,curl将使用相同的未修改方法重新发送以下请求。

    CURL OUTPUT(为简洁而编辑)(还要注意它是如何表示它将切换到GET [从POST错误地],但是它似乎无论如何都要做PUT):

    curl -X PUT -H "Authorization: Basic AUTHZ==" -H "Content-Type: application/json" -H "Cache-Control: no-cache" -H "Postman-Token: e80657f0-a8f5-af77-1d9d-d7bc22ed0b30" -d '{ JSONDATA"}' http://localhost:8080/hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c -v -L
    * Hostname was NOT found in DNS cache
    *   Trying 127.0.0.1...
    * Connected to localhost (127.0.0.1) port 8080 (#0)
    > PUT /hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c HTTP/1.1
    > User-Agent: curl/7.37.1
    > Host: localhost:8080
    > Accept: */*
    > Authorization: Basic AUTHZ==
    > Content-Type: application/json
    > Cache-Control: no-cache
    > Postman-Token: e80657f0-a8f5-af77-1d9d-d7bc22ed0b30
    > Content-Length: 203
    >
    * upload completely sent off: 203 out of 203 bytes
    < HTTP/1.1 301 Moved Permanently
    < Connection: keep-alive
    < X-Powered-By: Undertow/1
    < Set-Cookie: rememberMe=deleteMe; Path=/hc; Max-Age=0; Expires=Fri, 20-Feb-2015 03:53:28 GMT
    < Set-Cookie: JSESSIONID=uwI3_41LAa7vlvapTsrZdw10.macbook-air; path=/hc
    * Server WildFly/8 is not blacklisted
    < Server: WildFly/8
    < Location: /hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c
    < Content-Length: 0
    < Date: Sat, 21 Feb 2015 03:53:28 GMT
    <
    * Connection #0 to host localhost left intact
    * Issue another request to this URL: 'http://localhost:8080/hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c'
    * Switch from POST to GET
    * Found bundle for host localhost: 0x7f9e4b415430
    * Re-using existing connection! (#0) with host localhost
    * Connected to localhost (127.0.0.1) port 8080 (#0)
    > PUT /hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c HTTP/1.1
    > User-Agent: curl/7.37.1
    > Host: localhost:8080
    > Accept: */*
    > Authorization: Basic dGVzdHVzZXIxOlBhc3N3b3JkMQ==
    > Content-Type: application/json
    > Cache-Control: no-cache
    > Postman-Token: e80657f0-a8f5-af77-1d9d-d7bc22ed0b30
    >
    < HTTP/1.1 500 Internal Server Error
    < Connection: keep-alive
    < Set-Cookie: JSESSIONID=fDXxlH2xI-0-DEaC6Dj5EhD9.macbook-air; path=/hc
    < Content-Type: text/html; charset=UTF-8
    < Content-Length: 8593
    < Date: Sat, 21 Feb 2015 03:53:28 GMT
    <
    

    ......失败随之而来......它实际上是一个PUT

    提前感谢。

1 个答案:

答案 0 :(得分:2)

我认为你在301重定向部分读得太多了。

如果要使用PUT更新资源,请返回:

  • 201:如果资源已创建
  • 200:使用更新的资源

有问题的301仅适用于实际存在重定向的情况 - 例如,如果可以通过名称识别某些内容,并且您需要将其重定向到具有ID或其他内容的网址。 (也许你重构,人们仍在使用旧的端点)。

那么,你真的需要重定向你的PUT请求吗?因为您应该使用200在同一循环中发回更新的资源,如上所述,而不是“重定向到GET”。

编辑:修复一些拼写。