RESTful Web服务 - 多种POST方法。如何从Android应用程序中调用特定的一个?

时间:2013-07-22 11:29:09

标签: android web-services jax-rs

我使用RESTful方法编写了一个Web服务,并且我有多个接受POST请求的方法,例如:

@Path("/user")
class User{
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public UserMasterDto getUserDetails(MultivaluedMap<String, String> userParams) {
         // other stuff..
    }

    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public UserMasterDto getUserDetails2(MultivaluedMap<String, String> userParams){
         // other stuff..
    }
}

我想从Android应用程序中调用特定方法,例如getUserDetails2。 我需要做什么?

1 个答案:

答案 0 :(得分:4)

您目前拥有服务代码设置的方式我认为它会引发某种媒体类型冲突异常,因为您有两种方法可以在同一URL和相同的消费媒体类型上提供请求。

如果要调用其中一种方法,则需要消除它们的歧义。一个非常简单的解决方案是这样的:

@Path("/user")
public class User {

    @Path("1")
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public UserMasterDto getUserDetails(MultivaluedMap<String, String> userParams) {
        // ...
    }

    @Path("2")
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public UserMasterDto getUserDetails2(MultivaluedMap<String, String> userParams) {
        // ...
    }
}

注意方法的额外@Path。现在,从您的客户端,如果您访问/user/1,则会调用第一个方法,如果您访问/user/2,则会调用第二个方法。

您甚至可以只使用一种方法并根据路径参数进行区分,如下所示:

@Path("/user")
public class User {

    @Path("{x}")
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public UserMasterDto getUserDetails(
            @PathParam("x") int x,
            MultivaluedMap<String, String> userParams) {

        if (x == 1) {
            //do something
        } else if (x == 2) {
            //do something else
        }

        // ...
    }
}

您甚至可以use regular expressions,如果多个方法可以应用于同一个网址,则会触发一些precedence rules

请记住, REST不是要调用服务器上的方法,而是访问资源。因此,为了避免混淆(人们可能认为12是某些用户的ID),您可能需要仔细选择您的网址(以上只是一个示例)。这实际上取决于你最喜欢它的方式以及你的确切需求。