这些URI中的哪一个更适合接收POST(添加产品)?是否有最佳实践或仅仅是个人偏好?
/ product / (单数)
或
/ products / (复数)
目前我们使用/products/?query=blah
进行搜索,/product/{productId}/
使用GETs PUT&单个产品的DELETE。
答案 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)
正如许多人所说,只要你保持一致,你可以选择任何你喜欢的风格,但是我想指出双方的一些论点;我个人偏向于单数
支持多个资源名称:
支持单数资源名称(在处理多个资源时,这不会排除复数)
答案 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服务的请求类型,并根据请求方法执行相应的操作。