2013-07-22 39 views
0

我一直在使用RESTful方式編寫的Web服務,我有一個以上的方法,接受POST請求,如:REST風格的Web服務 - 多種POST方法。如何從android應用程序調用特定的一個?

@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.. 
    } 
} 

我要調用特定的方法,說getUserDetails2,從一個Android應用程序。 我需要做什麼?

回答

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如果多種方法可以申請相同的URL,然後也有一些precedence rules觸發。

請記住,REST不是關於在服務器上調用方法,而是訪問資源。因此,爲了避免混淆(人們可能認爲12是某些用戶的ID),您可能需要仔細選擇您的URL(以上僅爲示例)。這取決於你最喜歡的方式以及你確切的需求。

+0

感謝您的重播兄弟。 –

+0

它的工作按照您的建議.. –

相關問題