3

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

我必须在请求中发送的只是一个 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 格式?

4

3 回答 3

3

如果您查看哪些 HTTP 方法与哪些 CRUD 方法匹配?那里显示了映射

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/等,这将有助于可维护性,但是人类可读的 URL 是否是 RESTful 服务的一个特性是一个llloooonnnggg-running 参数

正如评论中提到的那样,RESTful API 应该关注内容而不是操作。请参阅:为什么在 REST 实现中的 URI 中包含动作动词会违反协议?例如。

因此,您将一个人传递给一个 URL,并根据 HTTP 动词采取相关的 CRUD 操作。如果您只想传递一个 ID,那么您将不得不猜测当您 PUT 到 ID 时要进行什么更新......除非您知道永远不会有任何其他更新。

于 2012-10-03T13:58:07.047 回答
0

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

于 2012-10-03T13:54:06.170 回答
0

我建议您POST访问以下网址:

http://serverName/PersonServices/Person/123456

但是,您不应该 POST 一个空的正文,您的正文应该包含您想要更新的字段,采用标准的 POST 正文参数语法。

例如status=NO

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

firstName=Jesse&status=YES

通过这种方式,URL 保持了它们对应于资源的事实(与包含RevokePerson或类似路径参数的操作相反)。这通过避免您想要执行的每个操作的一堆不同的 URL 端点,提供了最大的灵活性和最小的 API 污染。

于 2012-10-03T14:23:25.600 回答