40

这些 URI 中的哪一个更“适合”接收 POST(添加产品)?是否有任何最佳实践可用,或者只是个人喜好?

/product/(单数)

或者

/products/(复数)

目前我们/products/?query=blah用于搜索和/product/{productId}/获取单个产品的 PUT 和 DELETE。

4

7 回答 7

28

由于 POST 是一个“附加”操作,因此POST to可能/products更英文,因为您会将新产品附加到现有产品列表中。

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

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

于 2009-11-06T20:46:55.960 回答
11

通常,当您事先不知道资源的标识符时,您使用 POST 创建资源,并在知道时使用 PUT。因此,您将 POST 到 /products,或 PUT 到 /products/{new-id}。

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

于 2009-11-06T20:46:56.413 回答
4

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

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

所以,在你的情况下,我建议使用/products

于 2009-11-10T19:03:54.173 回答
3

您发布或获取单一事物:单一产品。

有时您 GET 没有特定产品(或没有查询条件)。但是你还是用单数说。

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

于 2009-11-06T20:43:17.340 回答
1

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

于 2009-11-10T18:58:39.603 回答
1

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

支持复数资源名称:

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

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

  • URL 方案更复杂,但你获得了更多的表现力
  • 你总是知道什么时候根据资源名称处理一个或多个资源,而不是检查资源是否有额外的 Id 路径组件
  • 对于非母语人士来说,复数有时更难(当不仅仅是“s”时)
  • 网址较长
  • 从程序员的角度来看,“s”似乎是多余的
  • 将路径参数视为集合的子资源只是尴尬,而不是考虑它的本质:只是它标识的资源的 ID
  • 您可以仅在需要的地方应用过滤参数(具有复数资源名称的端点)
于 2014-06-24T06:21:30.103 回答
-2

您可以对所有这些都使用相同的 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 服务的请求类型,并根据请求方法执行适当的操作。

于 2009-11-06T20:58:19.740 回答