这些 URI 中的哪一个更“适合”接收 POST(添加产品)?是否有任何最佳实践可用,或者只是个人喜好?
/product/(单数)
或者
/products/(复数)
目前我们/products/?query=blah
用于搜索和/product/{productId}/
获取单个产品的 PUT 和 DELETE。
这些 URI 中的哪一个更“适合”接收 POST(添加产品)?是否有任何最佳实践可用,或者只是个人喜好?
/product/(单数)
或者
/products/(复数)
目前我们/products/?query=blah
用于搜索和/product/{productId}/
获取单个产品的 PUT 和 DELETE。
由于 POST 是一个“附加”操作,因此POST to可能/products
更英文,因为您会将新产品附加到现有产品列表中。
只要您对 API 中的某些内容进行了标准化,我认为这就足够了。
由于 REST API 应该是超文本驱动的,因此 URI 无论如何都相对无关紧要。客户端应该从返回的文档中提取 URI 并在后续请求中使用这些 URI;通常应用程序和人们不需要猜测或直观地解释 URI,因为应用程序将明确指示客户端哪些资源和 URI 可用。
通常,当您事先不知道资源的标识符时,您使用 POST 创建资源,并在知道时使用 PUT。因此,您将 POST 到 /products,或 PUT 到 /products/{new-id}。
使用这两者,您将返回 201 Created,并且使用 POST 额外返回一个 Location 标头,其中包含新创建的资源的 URL(假设它已成功创建)。
在 RESTful 设计中,有一些围绕创建新资源的模式。您选择的模式很大程度上取决于谁负责为新创建的资源选择 URL。
如果客户端负责选择 URL,则客户端应 PUT 到资源的 URL。相反,如果服务器负责资源的 URL,那么客户端应该 POST 到“工厂”资源。通常,工厂资源是正在创建的资源的父资源,并且通常是一个复数集合。
所以,在你的情况下,我建议使用/products
您发布或获取单一事物:单一产品。
有时您 GET 没有特定产品(或没有查询条件)。但是你还是用单数说。
你很少使用复数形式的名字。如果您有一个集合(产品目录),它就是一个目录。
我只会发布到单数/product
。混淆这两个 URL-s 太容易混淆或犯错误了。
正如很多人所说,你可以选择任何你喜欢的风格,只要你保持一致,但我想指出双方的一些论点;我个人偏向于单数
支持复数资源名称:
支持单数资源名称(在处理多个资源时不排除复数)
您可以对所有这些都使用相同的 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 服务的请求类型,并根据请求方法执行适当的操作。