我正在创建一个REST接口(我们都不是),我想更新一个资源。
所以,我认为使用PUT。
所以,我读了this。
我带走的是我将PUT转换为这样的网址
/hc/api/v1/organizer/event/762d36c2-afc5-4c51-84eb-9b5b0ef2990c
使用有效负载,然后永久重定向到URL,它可以获取资源的更新版本。 在这种情况下,它恰好是相同的URL,不同的操作。
所以我的问题是:
我问第二个问题,因为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
提前感谢。
答案 0 :(得分:2)
我认为你在301重定向部分读得太多了。
如果要使用PUT更新资源,请返回:
有问题的301仅适用于实际存在重定向的情况 - 例如,如果可以通过名称识别某些内容,并且您需要将其重定向到具有ID或其他内容的网址。 (也许你重构,人们仍在使用旧的端点)。
那么,你真的需要重定向你的PUT请求吗?因为您应该使用200在同一循环中发回更新的资源,如上所述,而不是“重定向到GET”。
编辑:修复一些拼写。