Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 区分REST中命名资源的创建和更新_Http_Rest_Put - Fatal编程技术网

Http 区分REST中命名资源的创建和更新

Http 区分REST中命名资源的创建和更新,http,rest,put,Http,Rest,Put,我已经通读了,我知道PUT用于创建和更新特定资源,其标识符在URL中给出 但是,如果我要用if-Match严格执行“update”操作(这意味着用户必须提供有效的ETag来更新资源),因为PUT也用于创建命名资源(不需要if-Match),那么API将不得不猜测PUT请求是指更新还是指通过提供if-Match头来创建 我知道这是可以做到的,但我觉得这很奇怪。是否有其他(更合理的)方法(不使用PUT) 谢谢 更新: 以下是我目前的设想: # create the resource the firs

我已经通读了,我知道PUT用于创建和更新特定资源,其标识符在URL中给出

但是,如果我要用if-Match严格执行“update”操作(这意味着用户必须提供有效的ETag来更新资源),因为PUT也用于创建命名资源(不需要if-Match),那么API将不得不猜测PUT请求是指更新还是指通过提供if-Match头来创建

我知道这是可以做到的,但我觉得这很奇怪。是否有其他(更合理的)方法(不使用PUT)

谢谢

更新:

以下是我目前的设想:

# create the resource the first time
curl -X PUT -d '{"foo": "bar"}' /resource/r_id 

# the resource already exists, so this will fail with a 4xx error
curl -X PUT -d '{"foo": "bar2"}' /resource/r_id 

# must provide valid If-Match to make updates work
curl -X PUT -H 'If-Modefied: myetag' -d '{"foo": "bar2"}'  /resource/r_id

# what makes it confusing is this:
# user want to make a new record, but /resource/r_id2 in fact exists
# the API will return an error message, should it be
# "creation failed -- already exist" or "update failed -- ETag not provided"?
curl -X PUT -d '{"foo": "bar"}' /resource/r_id2

这并不是说这不能做到,只是我认为这个设计(使用PUT进行ETag控制的更新和命名创建)可能会令人困惑,我个人认为如果我使用不同的词汇(不仅仅是PUT)会更好,但是,我在这里问,我可以用什么样的合理的、RESTful的方式来实现这一点。

您不需要使用If-Match来限制更新。收到PUT后,请检查数据存储。如果具有给定id的资源尚不存在,请创建它。如果是,则更新它,使其具有给定的值

如果Match购买的是确保数据存储中的资源没有更改,该怎么办。您试图避免这种情况:

client 1: GET /resources/1
client 2: GET /resources/1
client 2: PUT /resources/1 with updates
client 1: PUT /resources/1 with updates

您不需要使用If Match限制更新。收到PUT后,请检查数据存储。如果具有给定id的资源尚不存在,请创建它。如果是,则更新它,使其具有给定的值

如果Match购买的是确保数据存储中的资源没有更改,该怎么办。您试图避免这种情况:

client 1: GET /resources/1
client 2: GET /resources/1
client 2: PUT /resources/1 with updates
client 1: PUT /resources/1 with updates

您不需要使用If Match限制更新。收到PUT后,请检查数据存储。如果具有给定id的资源尚不存在,请创建它。如果是,则更新它,使其具有给定的值

如果Match购买的是确保数据存储中的资源没有更改,该怎么办。您试图避免这种情况:

client 1: GET /resources/1
client 2: GET /resources/1
client 2: PUT /resources/1 with updates
client 1: PUT /resources/1 with updates

您不需要使用If Match限制更新。收到PUT后,请检查数据存储。如果具有给定id的资源尚不存在,请创建它。如果是,则更新它,使其具有给定的值

如果Match购买的是确保数据存储中的资源没有更改,该怎么办。您试图避免这种情况:

client 1: GET /resources/1
client 2: GET /resources/1
client 2: PUT /resources/1 with updates
client 1: PUT /resources/1 with updates

您可以使用“If None Match:*”来保护要创建的PUT,请参阅


也可以考虑使用.< /p> ,您可以用“如果不匹配:*”来创建PUT来创建,参见.P/>


也可以考虑使用.< /p> ,您可以用“如果不匹配:*”来创建PUT来创建,参见.P/>


也可以考虑使用.< /p> ,您可以用“如果不匹配:*”来创建PUT来创建,参见.P/>


也可以考虑使用.

你可以试着模仿设计好的REST API。< /P> 例如,CouchDB设计人员选择发出

409 Conflict
作为状态,发出
{“error”:“Conflict”,“reason”:“Document update Conflict.”}
作为主体


注意:当然要删除“文档”,因为它是特定于应用程序的。

您可以尝试模仿设计良好的RESTAPI

例如,CouchDB设计人员选择发出
409 Conflict
作为状态,发出
{“error”:“Conflict”,“reason”:“Document update Conflict.”}
作为主体


注意:当然要删除“文档”,因为它是特定于应用程序的。

您可以尝试模仿设计良好的RESTAPI

例如,CouchDB设计人员选择发出
409 Conflict
作为状态,发出
{“error”:“Conflict”,“reason”:“Document update Conflict.”}
作为主体


注意:当然要删除“文档”,因为它是特定于应用程序的。

您可以尝试模仿设计良好的RESTAPI

例如,CouchDB设计人员选择发出
409 Conflict
作为状态,发出
{“error”:“Conflict”,“reason”:“Document update Conflict.”}
作为主体


注:当然要删除“文档”,因为它是特定于应用程序的。

如果键入If-Match标题会让你觉得奇怪,那怎么办?@Pete-Hi,我已经更新了这个问题。如果键入If-Match标题会让你觉得奇怪呢?@Pete-Hi,我已经更新了这个问题。键入If-Match标题会让你感觉奇怪吗?@Pete Hi,我已经更新了这个问题。键入If-Match标题会让你感觉奇怪吗?@Pete Hi,我已经更新了这个问题。是的,我买的是What-If-Match,这是先决条件。我已经用样本更新了我的问题,请检查,谢谢。是的,我买的是如果Match给出了什么,这是先决条件。我已经用样本更新了我的问题,请检查,谢谢。是的,我买的是如果Match给出了什么,这是先决条件。我已经用样本更新了我的问题,请检查,谢谢。是的,我买的是如果Match给出了什么,这是先决条件。我已经用示例更新了我的问题,请检查,谢谢。所以我应该把“创建失败”和“更新失败”放在一起,比如,“创建失败或更新失败”可以吗?最重要的是使用标准HTTP状态。该机构只是在这里帮助客户机实现者。我认为他们可以在“更新冲突”这个通用短语中生存下来,无论是失败的创建还是更新。而且“创建”失败是因为“更新”冲突。所以我应该把“创建失败”和“更新失败”放在一起,比如,“创建失败或更新失败”就可以了?最重要的是使用标准HTTP状态。该机构只是在这里帮助客户机实现者。我认为他们可以在“更新冲突”这个通用短语中生存下来,无论是失败的创建还是更新。而且“创建”失败是因为“更新”冲突。所以我应该把“创建失败”和“更新失败”放在一起,比如,“创建失败或更新失败”可以吗?最重要的是使用