java – 如何访问RESTful POST方法中的参数

我的POST方法如下所示:

@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
    System.out.println("param1 = " + param1);
    System.out.println("param2 = " + param2);
}

当我在Netbeans中创建一个Jersey客户端时,调用post方法的方法如下所示:

public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}

运行此测试时:

@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}

它在服务器中提供以下输出:

INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 

我需要改变什么,以使参数给出正确的值?

您的@POST方法应该接受JSON对象而不是字符串。 Jersey使用JAXB支持封送和解封JSON对象(见the jersey docs for details)。创建类:

@XmlRootElement
public class MyJaxBean {
    @XmlElement public String param1;
    @XmlElement public String param2;
}

然后你的@POST方法如下所示:

@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
    System.out.println("param1 = " + input.param1);
    System.out.println("param2 = " + input.param2);
}

此方法需要接收JSON对象作为HTTP POST的主体。 JAX-RS将HTTP消息的内容体作为未注释的参数传递 – 在这种情况下是输入。实际消息看起来像:

POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com

{"param1":"hello","param2":"world"}

以这种方式使用JSON是很常见的显而易见的原因。但是,如果您正在使用JavaScript生成或使用它,那么您必须小心正确转义数据。在JAX-RS中,您将使用MessageBodyReaderMessageBodyWriter来实现这一点。我相信Jersey已经具有所需类型(例如,Java原语和JAXB包装类)以及JSON的实现。 JAX-RS支持许多其他传递数据的方法。这些不需要创建一个新类,因为数据是使用简单的参数传递传递的。

HTML< FORM>

参数将使用@FormParam

@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
                   @FormParam("param2") String param2) {
    ...
}

浏览器将使用“application/x-www-form-urlencoded”对表单进行编码.JAX-RS运行时将负责解码身体并将其传递给方法。这里是你应该看到的电线:

POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25

param1=hello&param2=world

在这种情况下内容为URL encoded

如果您不知道FormParam的名称,您可以执行以下操作:

@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
    ...
}

HTTP头

如果要通过HTTP标头传递参数,则可以使用@HeaderParam注释:

@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
                   @HeaderParam("param2") String param2) {
    ...
}

这里是HTTP消息的样子。请注意,此POST没有正文。

POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world

我不会使用这种方法进行广义参数传递。如果你需要访问一个特定的HTTP头的值,这是真的很方便。

HTTP查询参数

此方法主要用于HTTP GET,但它同样适用于POST。它使用@QueryParam注释。

@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
                   @QueryParam("param2") String param2) {
    ...
}

与前面的技术一样,通过查询字符串传递参数不需要消息体。这里是HTTP消息:

POST /create?param1=hello&param2=world HTTP/1.1
Content-Length: 0
Host: www.example.com

你必须特别小心在客户端正确encode query parameters。使用查询参数可能会有问题,因为某些代理强制实施的URL长度限制以及与对其进行编码相关联的问题。

HTTP路径参数

路径参数与查询参数类似,除了它们嵌入在HTTP资源路径中。这个方法似乎有利于今天。对HTTP缓存有影响,因为路径是真正定义HTTP资源的。代码看起来有点不同,因为@Path注释被修改,它使用@PathParam

@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
                   @PathParam("param2") String param2) {
    ...
}

该消息类似于查询参数版本,除了参数的名称不包括在消息中的任何位置。

POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com

此方法与查询参数版本共享相同的编码困难。 Path segments are encoded differently所以你必须要小心那里。

你可以看到,每个方法都有利弊。选择通常由您的客户决定。如果您正在提供基于FORM的HTML页面,请使用@FormParam。如果你的客户端是基于JavaScript HTML5的,那么你可能想使用基于JAXB的序列化和JSON对象。 MessageBodyReader / Writer实现应该为您处理必要的转义,这样可以减少一些错误。如果你的客户端是基于Java的,但没有一个好的XML处理器(例如Android),那么我可能会使用FORM编码,因为内容主体比URL更容易生成和编码。希望这个迷你wiki条目阐明了JAX-RS支持的各种方法。

注意:为了充分公开的利益,我还没有实际使用泽西岛的这个功能。我们正在修改它,因为我们已经部署了一些JAXB JAX-RS应用程序,并且正在移动到移动客户端空间。 JSON比HTML5或基于jQuery的解决方案更好地适合XML。

http://stackoverflow.com/questions/8194408/how-to-access-parameters-in-a-restful-post-method

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 如何访问RESTful POST方法中的参数