RESTful POSTS,你将对象POST到单数或复数Uri吗?

时间:2009-11-06 20:41:17

标签: rest restful-url

这些URI中的哪一个更适合接收POST(添加产品)?是否有最佳实践或仅仅是个人偏好?

/ product / (单数)

/ products / (复数)

目前我们使用/products/?query=blah进行搜索,/product/{productId}/使用GETs PUT&单个产品的DELETE。

7 个答案:

答案 0 :(得分:27)

由于POST是一个“追加”操作,因此您可能会更加英语,以便向/products发送邮件,因为您要将新产品附加到现有产品列表中。< / p>

只要您对API中的某些内容进行了标准化,我认为这就足够了。

由于REST API应该是超文本驱动的,因此无论如何URI都相对无关紧要。客户端应该从返回的文档中提取URI并在后续请求中使用这些URI;通常,应用程序和人员不需要猜测或直观地解释URI,因为应用程序将明确地指示客户端可用的资源和URI。

答案 1 :(得分:11)

通常,如果您事先不知道资源的标识符,则使用POST来创建资源,而在执行此操作时则使用PUT。所以你要发布到/ products,或者PUT到/ products / {new-id}。

使用这两个文件,您将返回201 Created,并且POST还会返回一个Location头,其中包含新创建的资源的URL(假设已成功创建)。

答案 2 :(得分:3)

您发布或获取单个内容:单个产品。

有时您没有特定产品(或查询标准)。但你仍然以单数形式说出来。

您很少使用复数形式的名称。如果您有一个集合(产品目录),那就是一个目录。

答案 3 :(得分:3)

在RESTful设计中,有一些关于创建新资源的模式。您选择的模式在很大程度上取决于谁负责选择新创建的资源的URL。

如果客户端负责选择URL,则客户端应该PUT到资源的URL。相反,如果服务器负责资源的URL,则客户端应POST到“工厂”资源。通常,工厂资源是正在创建的资源的父资源,通常是一个多元化的集合。

因此,在您的情况下,我建议您使用/products

答案 4 :(得分:0)

我只会发布单数/product。混淆这两个URL太容易混淆或犯错误。

答案 5 :(得分:0)

正如许多人所说,只要你保持一致,你可以选择任何你喜欢的风格,但是我想指出双方的一些论点;我个人偏向于单数

支持多个资源名称:

  • URL方案的简单性,因为您知道资源名称始终为复数
  • 许多人认为这个约定与数据库表的处理方式类似,并认为这是一个优势
  • 似乎被更广泛采用

支持单数资源名称(在处理多个资源时,这不会排除复数)

  • URL方案更复杂,但您获得更多表现力
  • 您总是知道何时基于资源名称处理一个或多个资源,而不是检查资源是否具有ID查找路径参数
  • 复数对于非母语人士来说有时会更难(当时不仅仅是&#34; s&#34;)
  • 网址较长
  • &#34; s&#34;似乎是程序员的一个多余部分&#39;观点出发
  • 将path参数视为集合的子资源而不是考虑它的含义是很尴尬的:只是它标识的资源的ID

答案 6 :(得分:-2)

您可以对所有这些URL使用相同的URL,并使用MessageContext确定Web服务的调用者想要执行的操作类型。 没有指定语言,但在Java中你可以做这样的事情。

WebServiceContext ws_ctx;
MessageContext ctx = ws_ctx.getMessageContext();
String action = (String)ctx.get(MessageContext.HTTP_REQUEST_METHOD);
if(action.equals("GET")
  // do something
else if(action.equals("POST")
  // do something

通过这种方式,您可以检查发送到Web服务的请求类型,并根据请求方法执行相应的操作。