在适当的REST API设计专门对PUT行动问题更新资源时(Questions on proper

2019-11-03 15:40发布

我创建一个REST接口(并非大家都),我想更新资源。

所以,我认为使用PUT。

所以,我看这个 。

我带走的是,我把到这样的网址

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

与有效载荷,然后永久重定向到它可以获得资源的更新版本的URL。 在这种情况下,它碰巧是相同的URL,不同的动作。

所以我的问题是:

  1. 是我在更新使用PUT正确的资源的了解,是我使用PUT正确的认识。
  2. 当客户端获得一个重定向它做对重定向的URL相同的动作,因为它没有在原来的网址是什么? 如果它的“依赖”是有一个标准的大多数客户跟进?

我问第二个问题,因为邮递员,我JQuery的AJAX调用窒息。 JQuery的,因为净:: ERR_TOO_MANY_REDIRECTS的。 因此,它是重定向并再次尝试PUT,它会得到另一个重定向?

卷曲的打击了太多,但即使它说,如果它得到301就会切换到一个GET,它并没有真正似乎这样做,当我看到在输出(下图)。

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

卷曲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

提前致谢。

Answer 1:

我认为你过分解读301重定向部分。

如果你想更新使用PUT资源,返回:

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

有问题的301只适用如果确实有问题重定向 - 样,如果事情可以通过名称标识,用户需要将其重定向到具有ID或东西的URL。 (也许你重构,人们仍会消耗老终点)。

所以,你真的需要重定向PUT请求? 因为你要在同一回路中使用200发回更新的资源,像上面说的,而不是“重定向到GET”。

编辑:修正了一些拼写。



文章来源: Questions on proper REST api design specifically on the PUT action when updating a resource
标签: rest http put