我有一个安静的网络服务,我正在编写一个新的方法调用。新方法调用的目的是将人员的状态撤销为“否”。
我必须在请求中发送的所有内容都是Person_Id,其状态需要更改为“NO”。
我应该使用PUT或POST来执行此操作吗?
如果我使用put,我可以将person_id作为路径参数发送,而根本不使用任何xml。
(like : http://serverName/PersonServices/Person/123456)
,在服务层,我的代码就像这样。
@PUT
@Path("/Person/{person_Id}")
@Consumes("application/xml")
@Produces("application/xml")
public JAXBElement<GetUsageTokenType> updateLicenseStatus(
@PathParam("person_Id") final Long personId) {
//code to change the status
}
或者我应该使用POST来做到这一点...... 我说得对,如果我使用POST,我需要发送xml格式吗?
答案 0 :(得分:3)
如果查看Which HTTP methods match up to which CRUD methods?,则会显示映射
Create = PUT with a new URI
POST to a base URI returning a newly created URI
Read = GET
Update = PUT with an existing URI
Delete = DELETE
如果您阅读每个动词定义的HTTP RFC,您可以看到原因......
回应:
我可以将person_id作为路径参数发送,而不是使用任何xml 在所有
然后理想情况下是您的网址
http://serverName/PersonServices/Person/123456
应该是
http://serverName/PersonServices/RevokePerson/123456
如果您不想传递任何XML / JSON / etc ,这将有助于维护但是人类可读的URL是否是RESTful服务的一个功能是llloooonnnggg-running argument
正如评论中所提到的,RESTful API应该关注内容而不是行动。例如,请参阅:Why does including an action verb in the URI in a REST implementation violate the protocol?。
因此,您将某个人传递给URL,并根据HTTP动词执行相关的CRUD操作。如果您只想传递一个ID,那么当您输入ID时,您将不得不猜测要采取的更新...除非您知道永远不会有任何其他更新。
答案 1 :(得分:0)
这取决于您如何实现服务器,但遵循正确的REST原则,您将需要使用PUT。
答案 2 :(得分:0)
我建议你POST
到网址:
http://serverName/PersonServices/Person/123456
你不应该发布一个空身体,你的身体应该包含你想要更新的字段,采用标准的POST体参数语法。
E.g。 status=NO
对于个别(或多个)字段更新,我认为这是最好的方法。例如,如果您需要更新请求中的几个字段,则可以使用...
firstName=Jesse&status=YES
这样URL保持了它们与资源相对应的事实(与您包含RevokePerson
或类似路径参数时的操作相反)。通过为您希望执行的每项操作避免使用大量不同的URL端点,这提供了最大的灵活性,同时最大限度地减少了API的污染。