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
Web services 哪个HTTP谓词适合设置布尔值?_Web Services_Http_Rest - Fatal编程技术网

Web services 哪个HTTP谓词适合设置布尔值?

Web services 哪个HTTP谓词适合设置布尔值?,web-services,http,rest,Web Services,Http,Rest,我有一个RESTful web服务,它公开一个资源,使您(登录用户)可以喜欢或不喜欢博客文章。我的问题是:什么是RESTfully正确的方式来表达这个资源 我的第一次尝试看起来像: PUT /likes/<blog_entry_id> # marks this blog entry as liked DELETE /likes/<blog_entry_id> # marks this blog entry as not liked PUT/likes/#将此博客

我有一个RESTful web服务,它公开一个资源,使您(登录用户)可以喜欢或不喜欢博客文章。我的问题是:什么是RESTfully正确的方式来表达这个资源

我的第一次尝试看起来像:

PUT    /likes/<blog_entry_id> # marks this blog entry as liked 
DELETE /likes/<blog_entry_id> # marks this blog entry as not liked
PUT/likes/#将此博客条目标记为liked
DELETE/likes/#将此博客条目标记为不喜欢
这一语义至少与PUT和DELETE的幂等性要求一致(即,重复调用PUT没有效果,除非插入DELETE,反之亦然)


对于布尔HTTP资源的管理是否有更传统的设计?

我认为您的方法很好,而且是restful的。
您还可以使用POST而不是PUT。

您需要在URI中包含某种用户标识。通过使用“登录用户”,您违反了资源标识约束和自我描述约束


唯一的另一个问题是,您似乎在使用PUT时没有经过一个实体。我以前从未见过这样的事。很可能HTTP规范允许这样做,只是有点奇怪。

我不想在资源URL中使用动词,而是使用以下方案:

POST/blog//fan
发送您要创建的资源的用户id和其他数据,作为“Like”操作的一部分。我在这里假设JSON,因此这可能是一个示例{“user”:http://..../user/34343,“时间戳”:234353443}

然后你可以使用
GET/blog//fan
获取所有喜欢该博客文章的用户的列表。我可能会发送一个资源的JSON表示,这样可以很容易地列出这些用户,并跟踪类似操作的数据链接(如果有)


GET/blog//fan/
要在关系数据库中获取类似操作的数据(如果有)

,我将其称为连接表的良好候选对象

LIKES ----- id blog_id user_id some_other_attribute_about_this_relationship another_attribute timestamp 喜欢 ----- 身份证件 博客id 用户id 关于这个关系的一些其他属性 另一个属性 时间戳 所以你要创造的是一个Like,或者Fan,或者BlogLike,或者BlogFan,或者BlogLiker,或者,你知道,Fan_of a_blog,如果你不喜欢简洁的话

这些是你的动词:

GET /likes return a list of Likes POST /likes create a new Like (payload is blog_id and user_id) GET /likes/id return a specific Like resource PUT /likes/id update a Like with new data DELETE /likes/id delete a Like 获取/喜欢返回喜欢的列表 发布/喜欢创建新的喜欢(负载是blog\u id和user\u id) GET/likes/id返回特定的Like资源 PUT/likes/id使用新数据更新Like 删除/likes/id删除一个Like
这将允许您在连接的任何一侧提出问题。例如,该用户是否喜欢某个博客?这个博客有3个以上的用户喜欢吗?等等。

他可以,但他的请求是幂等的。使用非幂等HTTP方法,当您发出幂等请求时,会使您的请求变得不那么“可见”。我认为PUT也是非幂等的(虽然在规范中没有检查这一点,但如果它是幂等的,则不可能将其用于更新。对吗?),所以从这个角度来看,使用PUT或POST并没有什么区别。因为他有点像“创造”,所以我觉得POST.PUT是幂等的。听起来你把“安全”和“幂等”混淆了。PUT不是“安全的”。你也可以使用PUT来创建东西。我认为使用“登录用户”也可以。资源是博客条目。“喜欢”的人不是资源的一部分。它可以是请求上的一个参数,或者以某种方式在正文中传递(因此它将是正文中的内容:),或者从cookie/header(“登录用户”)中获取。@Tarlog否它不正常。GET/like/13123将在您登录时返回一个结果,并在我登录时返回另一个结果。这是一个非常糟糕的主意,因为它使得中介很难缓存响应。这也让你很难看到我是否喜欢这个博客,每次都会发生。即使是在这个网站上,即使是在这个问题上:当我得到这个问题的URL时,我得到的回答也会有所不同,这取决于我是否登录。@Tarlog从概念上讲,它是同一个资源,所以在这种情况下是可以原谅的。不过,为了让它发挥作用,他们必须在回复中加入Vary:*。这严重削弱了中间缓存的好处。