如何从单个webservices类调用不同的方法

时间:2013-10-20 09:52:06

标签: java web-services rest

我有一个以下的RESTful webservice,我有两个http get方法。一个功能登录,其他功能从应用程序中签出用户。以下是代码:

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 get调用哪个函数?

2 个答案:

答案 0 :(得分: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”)用于上述其他方法。

然后调用正确的方法为用户登录或注销。

答案 1 :(得分:3)

应谨慎处理登录/注销,即确保使用正确的通道安全性(例如:SSL)和身份验证机制 - 查看安全框架(例如:Apache Shiro,Spring Security等)

来到您的问题(并从与处理安全/身份验证相关的任何问题中抽象出来),您可以拥有一个" base"资源"用户",在其上为不同的用户资源构建多个URI"。例如,您可以定义名为" loginstatus":

的用户资源
  • /users/{username}/loginstatus - 此资源允许指定/检索当前用户"登录状态"

要定义登录或退出"操作",您可以使用(在此方法中)"查询参数":

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

所以,基本上我们创建一个"资源"调用" loginstatus",它允许对它执行不同的操作......你不应该有一个名为"登录"的资源,这是一个"动作" ;或"动词"。 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
    }

}