3

我有一个宁静的web服务,为此我写了一个新的方法调用。新方法调用的目的是将某个人的状态撤销为“否”。Restful webservices ....放置或发布更新

我要发送的请求中只有一个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

这是用于POST&PUT的W3C HTTP RFC:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5 –

+0

下面是关于REST和POST在REST中的类似问题:http://stackoverflow.com/q/630453/346561 –

回答

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 根本就不是

那么最好你的URL

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

我认为RESTful API不应该在其URL中包含动作动词。在您建议的URL中包含RevokePerson使得这不是基于资源的。 –

+0

就像我说的这是一个长期运行的论点。如果您只想在URL中指定一个ID,您如何针对个人执行两种不同的更新?我想你真的应该放弃一个序列化的人,并会更新(在这种情况下通过撤销许可证)在另一端的人。我想我不清楚如何回应这个问题:“我可以只发送person_id作为路径参数,根本不使用任何xml” –

+0

我同意;这个话题还有很多积极的讨论。我曾尝试在URL中使用动作动词,并导致许多(100多个)不同的URL以各种方式修改相同的资源。事实证明这是一个糟糕的主意,所以我只是试图让他人摆脱同一个漏洞。这实际上只是我的意见,但对我来说,失败对他人来说可能是正确的,因此我没有投票。 ;) –

0

这取决于你如何实现你的服务器,但遵循适当的REST原则,你会想使用PUT。

0

我建议你POST到的网址:

http://serverName/PersonServices/Person/123456

你不应该虽然张贴空的身体,你的身体应该包含的字段,你想更新,在标准的POST身体参数语法。

E.g. status=NO

对于单个(或多个)现场更新,我认为这是最好的方法。例如,如果你需要更新你的要求几个字段,您可以使用...

firstName=Jesse&status=YES

这样的URL认为它们对应于资源(而不是像如果一个动作的事实你包括RevokePerson或类似的路径参数)。通过避免您希望执行的每个操作的一堆不同的URL端点,这可以提供最大的灵活性,并且对API的污染最小。