2

我有一个以下 RESTful 网络服务,我有两种 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 调用哪个函数?

4

2 回答 2

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") 用于上述其他方法。

然后调用适当的方法为用户登录或注销。

于 2013-10-20T10:16:17.087 回答
3

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

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

  • /users/{username}/loginstatus- 该资源将允许指定/检索当前用户“登录状态”

要定义登录或注销“操作”,您可以使用(在这种方法中)“查询参数”:

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

所以,基本上我们创建了一个名为“loginstatus”的“资源”,它允许对其执行不同的操作......你不应该有一个名为“登录”的资源,即“动作”或“动词”。APOST应该用于登录/注销 not GET,因为您不仅在检索资源,而且实际上是在对资源进行更改(登录或注销,这会更改用户“登录状态”资源 - 通常是用户身份验证数据库中的条目)。

您可以通过以下方式实现这一点:

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

}
于 2013-10-20T10:44:07.683 回答