2013-10-20 29 views
2

我有一個以下的REST風格的web服務,我有兩個http get方法。一個功能通過應用程序登錄並執行其他功能。以下是代碼:如何從單一的webservices類調用不同的方法

import javax.ws.rs.core.Context; 
import javax.ws.rs.core.UriInfo; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.PUT; 
import javax.ws.rs.Path; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 

/** 
* REST Web Service 
* 
* @author Pointer 
*/ 
@Path("generic") 
public class GenericResource { 

    @Context 
    private UriInfo context; 

    /** 
    * Creates a new instance of GenericResource 
    */ 
    public GenericResource() { 
    } 

    /** 
    * Retrieves representation of an instance of 
    * com.ef.apps.xmpp.ws.GenericResource 
    * 
    * @return an instance of java.lang.String 
    */ 
    @GET 
    @Produces("text/html") 
    public String SignIn(@QueryParam("username") String username, @QueryParam("password") String password, @QueryParam("extension") String extension) { 

     //TODO return proper representation object 
     return "Credentials " + username + " : " + password + " : " + extension; 
    } 

    @GET 
    @Produces("text/html") 
    public String SignOut(@QueryParam("username") String username, @QueryParam("password") String password, @QueryParam("extension") String extension) { 

     //TODO return proper representation object 
     return "Credentials " + username + " : " + password + " : " + extension; 
    } 
} 

現在,我將在哪裏指定我要調用哪個函數來獲取http?

回答

4

您應該從彼此使用註釋路徑

@Path("/SignIn") 
@GET 
@Produces("text/html") 
public String SignIn(@QueryParam("username") String username, @QueryParam("password") String password, @QueryParam("extension") String extension) { 

    //TODO return proper representation object 
    return "Credentials " + username + " : " + password + " : " + extension; 
} 

和@Path(「/ SignOut」),用於像上面其它方法分開的兩個方法。

然後調用正確的方法登錄或註銷用戶。

+0

我已經定義的路徑前級即@Path(「通用」),我必須將其刪除:

你可以有這樣的事情實現這個?因爲我現在正在收到內部服務器錯誤。 – pointer

+0

thanx很多幫助。 – pointer

+0

應該小心這種方法,因爲'/ signin'不是一個「資源」它是一個「動詞」/「動作」,這不是很符合REST原則......此外'GET'不應該在這種情況下使用,但'POST',因爲這個調用會對資源進行「更改」(用戶認證)。 – emgsilva

3

登錄/退出要慎重處理,即,確保使用正確的通道安全(如:SSL)和身份驗證機制 - 看看成安全框架(如:阿帕奇四郎,春季安全,等等。 )。您可以擁有一個「基礎」資源「用戶」,在其上爲不同的「用戶資源」創建多個URI。例如,你可以定義一個名爲「loginstatus」用戶資源:

  • /users/{username}/loginstatus - 這一資源將允許指定/獲取當前用戶「登錄狀態」

要定義登錄或先簽後換出 「行動」,你可以使用(以這種方式) 「查詢參數」:

  • POST /users/{username}/loginstatus?action=login&password=userPassword
  • POST /users/{username}/loginstatus?action=logout&password=userPassword

因此,基本上我們創建了一個名爲「loginstatus」的資源,它允許對其執行不同的操作......您不應該有一個名爲「登錄」的資源,即「操作」或「動詞」。 A POST應該用於登錄/註銷而不是GET,因爲您不僅要檢索資源,還要對資源進行更改(登錄或註銷,這會更改用戶「loginstatus」資源 - 通常是用戶認證數據庫中的條目)。

@Path("/users") 
public class GenericResource { 

    @POST 
    @Path{/{username}/loginstatus 
    @Produces("text/html") 
    public String SignIn(@PathParam("username") String username, 
      @QueryParam("password") String password, 
      @QueryParam("action") String action) { 

     // if action = "login" => perform login 
     // if action = "logout" => perform logout 
    } 

} 
+1

thanx emgsilva指導。 – pointer

相關問題