Web services REST-获取更新的资源

Web services REST-获取更新的资源,web-services,rest,url-design,Web Services,Rest,Url Design,我正在从事一项从博客中获取特定链接的服务。该服务会调用不同的站点,这些站点将数据拉入并存储 我在指定服务器上更新数据的url时遇到问题,我现在使用动词update来获取最新链接 我目前使用以下端点: GET /user/{ID}/links - gets all previously scraped links (few milliseconds) GET /user/{ID}/links/update - starts scraping and returned the scraped dat

我正在从事一项从博客中获取特定链接的服务。该服务会调用不同的站点,这些站点将数据拉入并存储

我在指定服务器上更新数据的url时遇到问题,我现在使用动词update来获取最新链接

我目前使用以下端点:

GET /user/{ID}/links - gets all previously scraped links (few milliseconds)
GET /user/{ID}/links/update - starts scraping and returned the scraped data (few seconds) 
第二个url的好选项是什么?我自己想出了一些例子

GET /user/{ID}/links?collection=(all|cached|latest)
GET /user/{ID}/links?update=1
GET /user/{ID}/links/latest
GET /user/{ID}/links/new

使用GET启动进程不是非常RESTful的。您并不是真正获得信息,而是要求服务器处理信息。您可能想针对/user/{ID]/links发布文章(如果您对其中的细节感到好奇,快速搜索PUT vs POST会让您无休止地阅读)。然后您有两个选择:

使用后台进程发布:如果使用后台进程(或队列)您可以返回一个202 Accepted,表示服务已接受请求并将要执行某些操作。202通常表示客户端不应等待,这在执行与时间相关的操作(如刮取)时是有意义的。然后,客户端可以在第一个链接上发出GET请求以检索更新

创造性地使用上次修改的头可以告诉客户端何时有新的更新可用。如果您想变得非常有趣,可以实现HEAD/user/{ID}/链接,该链接将返回上次修改的头,而不返回响应正文(节省带宽和处理)

直接处理帖子:如果您在请求过程中进行处理(在总体方案中这不是一个伟大的计划),您可以返回一个包含更新链接的200 OK回复正文

后续的get将正常执行


使用GET启动进程不是很RESTful。你不是真正获取信息,而是要求服务器处理信息。你可能想发布/user/{ID]/links(如果你对其中的细节感到好奇,快速搜索PUT vs POST会让你无休止地阅读)。你有两个选择:

使用后台进程发布:如果使用后台进程(或队列)您可以返回一个202 Accepted,表示服务已接受请求并将要执行某些操作。202通常表示客户端不应等待,这在执行与时间相关的操作(如刮取)时是有意义的。然后,客户端可以在第一个链接上发出GET请求以检索更新

创造性地使用上次修改的头可以告诉客户端何时有新的更新可用。如果您想变得非常有趣,可以实现HEAD/user/{ID}/链接,该链接将返回上次修改的头,而不返回响应正文(节省带宽和处理)

直接处理帖子:如果您在请求过程中进行处理(在总体方案中这不是一个伟大的计划),您可以返回一个包含更新链接的200 OK回复正文

后续的get将正常执行


/user//links
发送更新请求有什么问题?提示:为了让它更安静,你的url应该说
用户
,而不是
用户
注意不要用“更新”这个词来描述你想要的内容,或者您将得到不适合您的问题的答案。您确实希望获得用户链接。只是您希望在最新链接和缓存链接之间进行选择。这与(restful数据存储)非常相似。因此,答案可能是例如
GET/user/{ID}/links
GET/user/{ID}/links?cached=true
@TimCastelijns要挑一个缺点,REST并没有说明URL应该是什么样子。使用复数是一种惯例,也是一种好的用法,但它与RESTfull无关。@EricStein这是非常正确的。我应该选一个更好的词;-)向
/user//links
发出更新请求有什么问题?只是一个提示:如何更为restful的是,你的url应该是
users
,而不是
user
,小心不要用“update”这个词来描述你想要什么,否则你会得到不符合你问题的答案。你真的想获得用户链接。只是你想在最新链接和缓存链接之间进行选择。这与(一个restful数据存储)。因此答案可以是例如
GET/user/{ID}/links
GET/user/{ID}/links?cached=true
@TimCastelijns要挑一个缺点,REST并没有说明URL应该是什么样子。使用复数是一种惯例,也是一种好的惯例,但它与RESTfull无关。@EricStein这是非常正确的。我应该选一个更好的词;-)谢谢你的解释。使用后台进程听起来不错。如果我想手动添加链接怎么办?POST:/user/{id}/links?action=update:可以吗?POST/user/{id}/links?action=update也不是完全restful的。我建议创建一个特定于更新操作的端点,例如/user/{id}/链接/更新。这样你就知道你会得到什么(相对于POST/user/{id}/links?action=blarg,它是未定义的)。谢谢你的解释。使用后台过程听起来不错。如果我想手动添加链接怎么办?POST:/user/{id}/links?action=update:这可以吗?POST/user/{id}/links?action=update也不是完全restful的。我建议创建一个特定于更新操作的端点,例如/user/{id}/links/update。这样你就可以知道你将得到什么(而不是POST/user/{id}/links?action=blarg,它是未定义的)。