在Jersey +一般设计问题中使用其他参数发布/放置/删除http Json

时间:2011-09-15 11:48:01

标签: json rest http-post jersey

出于某种原因,我没有找到任何正常的方法来执行以下操作:

我想发布一个json对象,并在调用中添加其他参数(在本例中为身份验证令牌)。 这是myUrl / server中的一个简单的RESTful服务器,它可以访问url myUrl / server / person / personCode / resourceName中“person”的不同资源。

GET很简单,不需要任何对象,只需要参数。 当我进入POST时问题就出现了 - 如何附加JSON,并保留其他参数?

该课程(为了清晰和专有原因而被删除了很多......):

//Handles the person's resources
@Path("/person/{personCode}/{resourceName}")
public class PersonResourceProvider {

@GET
@Produces("application/json")
public String getPersonResource(@PathParam("personCode") String personCode, @PathParam("resourceName") String resourceName, @DefaultValue("") @QueryParam("auth_token") String auth_token) throws UnhandledResourceException, UnauthorizedAccessException {

    //Authenticates the user in some way, throwing an exception when needed...
    authenticate(personCode, auth_token, resourceName);

    //Returns the resource somehow...
}

@POST
@Produces("application/json")
public String postPersonResource(@PathParam("personCode") String personCode, @PathParam("resourceName") String resourceName, @DefaultValue("") @QueryParam("resourceData") String resourceData, @DefaultValue("") @QueryParam("auth_token") String auth_token) throws UnhandledResourceException, UnauthorizedAccessException {

    //Again, authenticating
    authenticate(personCode, auth_token, resourceName);

    //Post the given resource
    }
}

现在,当你去的时候,GET方法非常有效 myUrl / person / personCode / resourceName,它为我提供了正确的资源。 auth_token用于对服务器的每次调用(现在,通过与预定义的字符串进行比较来完成身份验证),因此需要它。除了身份验证令牌之外,所有其他参数都是通过路径提供的,身份验证令牌不应该在路径中,因为它与所需资源的身份无关。

当我进入POST时,这是一个问题。 我知道有一种方法可以告诉它消耗JSON的方法,但在这种情况下,其他参数会发生什么(auth_token是其中之一)? 我应该使用Multipart吗?

另一个相关的问题,这是我第一次设计这样的服务器,这个设计是否正确?

谢谢!

2 个答案:

答案 0 :(得分:4)

我不确定我理解你想要实现的目标。让我尝试解释一些事情 - 希望它与你的问题相关: @QueryParam注入作为路径一部分的参数 - 即“?”之后的URL部分。 例如。如果您有这样的网址: http://yourserver.com/person/personCode/resourceName?resourceData=abc&token=1234

然后会有2个查询参数 - 一个名为resourceData,值为“abc”,另一个名为token,值为“1234”。

如果要在POST请求中传递实体,并且该实体属于application / json类型,则可以使用@Consumes(“application / json”)注释简单地注释post方法,并在方法中添加另一个参数,根本不需要注释。 该参数可以是String(在这种情况下,Jersey会传递一个原始JSON字符串而你必须自己解析它)或者它可以是一个用@XmlRootElement注释注释的java bean - 在这种情况下(如果你还包括jersey-您的类路径上的json模块)Jersey将尝试使用JAXB将json字符串解组为该对象。您也可以使用Jackson或Jettison库来执行此操作 - 有关详细信息,请参阅Jersey用户指南的此部分:http://jersey.java.net/nonav/documentation/latest/json.html

答案 1 :(得分:3)

实测!

客户方:

Client c = Client.create();
WebResource service = c.resource("www.yourserver.com/");
String s = service.path("test/personCode/resourceName")
                .queryParam("auth_token", "auth")
                .type("text/plain")
                .post(String.class, jsonString);

服务器端:

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;

@Path("/test/{personCode}/{resourceName}")
public class TestResourceProvider {

@POST
@Consumes("text/plain")
@Produces("application/json")
public String postUserResource(String jsonString,                                              
                               @PathParam("personCode") String personCode,                                                                                      
                               @PathParam("resourceName") String resourceName,                                                   
                               @QueryParam("auth_token") String auth_token)                                                  
                               throws UnhandledResourceException {

    //Do whatever...    

    }
}

在我的情况下,我将解析我在服务器中获取的json,具体取决于资源名称,但您也可以传递对象本身,并使服务器使用“application / json”。