Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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

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
Api 编辑冲突和409对412的响应_Api_Http_Rest - Fatal编程技术网

Api 编辑冲突和409对412的响应

Api 编辑冲突和409对412的响应,api,http,rest,Api,Http,Rest,我们有一个RESTAPI,用于处理应用程序后端。我们需要实现一个冲突预防功能,该功能将根据编辑请求(POST/PUT)检查记录是否在客户上次读取记录到现在之间未被修改,如果是,将告诉客户存在冲突 问题是如何发送冲突检查标记(最有可能是一个时间戳,但我们不想强制这样做)以及如何返回错误 我们希望尽可能多地使用标准的REST模式,因此这里我们考虑了以下解决方案: 如果自起修改,则使用。这里的问题是,它要求使用时间戳,并且规范要求您必须返回412。我们希望返回更具体的409代码,以表明这是一个编辑冲

我们有一个RESTAPI,用于处理应用程序后端。我们需要实现一个冲突预防功能,该功能将根据编辑请求(POST/PUT)检查记录是否在客户上次读取记录到现在之间未被修改,如果是,将告诉客户存在冲突

问题是如何发送冲突检查标记(最有可能是一个时间戳,但我们不想强制这样做)以及如何返回错误

我们希望尽可能多地使用标准的REST模式,因此这里我们考虑了以下解决方案:

  • 如果自起修改,则使用。这里的问题是,它要求使用时间戳,并且规范要求您必须返回412。我们希望返回更具体的409代码,以表明这是一个编辑冲突,而不是由其他原因导致的更一般的412。这也会使客户端更容易对编辑冲突进行特殊处理,因为它们会有专用的错误代码

  • 如果匹配,则使用。更好,因为我们可以使用附加到它的任何数据,但是规范要求使用412,即使409更适合我们的情况。此外,规范建议,如果匹配与Etag相关联,我们不会对数据使用Etag,因为为每个记录计算适当的Etag是不可行的。我们有将用于检查的标记,作为记录数据的一部分,但它不是作为ETag发送的,现有客户机不处理ETag,因此如果可能,我们不希望将此新要求强加给客户机

  • 使用自定义X头。这将很好地工作,并且对于客户端来说添加起来非常容易,但是如果可能的话,我们更喜欢使用标准的REST方法


那么,在这种情况下,推荐的方法是什么?有没有一种方法可以使用标准的REST方式,用409回复,让一切都干净整洁

基本上,如果标题中有
if-*
前提条件,则必须返回
412
。即使使用自定义的
X-Header
,也只意味着Header没有定义它必须返回
412
。如果将自定义标题用作前提条件,则应根据其定义返回
412

此响应代码允许客户端在当前资源元信息(标题字段数据)上放置前提条件

E-Tag
通常仅作为
If-*
先决条件的一部分在请求中发送,因此如果您想要
409
,则不会使用
E-Tag

如果要使用
409
,只需将前置条件或后置条件放在请求正文中,而不是头中。当条件失败时,WebDav返回
403
409
<代码>409当客户端可能能够修复请求时


因此,总结一下:如果您的先决条件在标题中,请使用
412
,否则请使用
409

,这就是我想使用409的原因-用例就是客户机将获得新数据,然后使用更新的数据重复请求。您可以像webdav一样执行此操作。它有自己的标题,标题中有一个“版本控制”字段。这样,您就不会在http头中放入任何内容,所以可以返回409。