我有一个以下的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调用哪个函数?
答案 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
}
}