宁静的网络服务....发布或发布更新

时间:2012-10-03 13:52:35

标签: java web-services rest amazon-web-services webservice-client

我有一个安静的网络服务,我正在编写一个新的方法调用。新方法调用的目的是将人员的状态撤销为“否”。

我必须在请求中发送的所有内容都是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格式吗?

3 个答案:

答案 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的污染。