首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何访问RESTful POST方法中的参数

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

Stack Overflow用户
提问于 2011-11-19 21:37:02
回答 1查看 311.9K关注 0票数 124

我的POST方法看起来像这样:

代码语言:javascript
复制
@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方法的方法如下所示:

代码语言:javascript
复制
public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}

运行此测试时:

代码语言:javascript
复制
@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}

它在服务器中给出了以下输出:

代码语言:javascript
复制
INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 

我需要更改什么才能使参数提供正确的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-19 22:18:18

您的@POST方法应该接受JSON对象而不是字符串。Jersey使用JAXB来支持编组和解组JSON对象(参见the jersey docs for details)。创建类,如下所示:

代码语言:javascript
复制
@XmlRootElement
public class MyJaxBean {
    @XmlElement public String param1;
    @XmlElement public String param2;
}

然后,您的@POST方法将如下所示:

代码语言:javascript
复制
@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消息的内容主体作为一个未注释的参数传递--在本例中为input。实际的消息看起来像这样:

代码语言:javascript
复制
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支持许多其他的数据传递方法。这些不需要创建新的类,因为数据是使用简单的参数传递来传递的。

<FORM> 超文本标记语言

这些参数将使用@FormParam进行注释

代码语言:javascript
复制
@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
                   @FormParam("param2") String param2) {
    ...
}

浏览器将使用"application/x-www-form-urlencoded"对表单进行编码。JAX-RS运行时将负责解码主体并将其传递给方法。下面是你应该在网上看到的内容:

代码语言:javascript
复制
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

在本例中,内容为。

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

代码语言:javascript
复制
@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
    ...
}

Headers

如果你想通过HTTP头传递参数,你可以使用@HeaderParam注解:

代码语言:javascript
复制
@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
                   @HeaderParam("param2") String param2) {
    ...
}

下面是HTTP消息的样子。请注意,这篇文章没有正文。

代码语言:javascript
复制
POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world

我不会使用这种方法来传递泛化参数。但是,如果您需要访问特定HTTP标头的值,那么它非常方便。

HTTP查询参数

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

代码语言:javascript
复制
@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
                   @QueryParam("param2") String param2) {
    ...
}

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

代码语言:javascript
复制
POST /create?param1=hello&param2=world HTTP/1.1
Content-Length: 0
Host: www.example.com

您必须特别小心在客户端正确地执行encode query parameters操作。由于某些代理实施的URL长度限制以及与编码相关的问题,使用查询参数可能会出现问题。

HTTP路径参数

path参数与查询参数类似,只是它们嵌入在HTTP资源路径中。这种方法似乎在今天很受欢迎。这对HTTP缓存有影响,因为路径是真正定义HTTP资源的路径。由于修改了@Path注释并使用了@PathParam,因此代码看起来与其他代码略有不同

代码语言:javascript
复制
@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
                   @PathParam("param2") String param2) {
    ...
}

该消息类似于查询参数版本,不同之处在于参数的名称不包含在消息中的任何位置。

代码语言:javascript
复制
POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com

此方法与查询参数版本具有相同的编码问题。所以你也要小心,Path segments are encoded differently,所以你也要小心。

正如您所看到的,每种方法都有优缺点。选择通常由你的客户决定。如果您提供的是FORM-based超文本标记语言页面,则使用@FormParam。如果您的客户机是基于JavaScript+HTML5的,那么您可能希望使用基于JAXB的序列化和JSON对象。MessageBodyReader/Writer实现应该为您处理必要的转义,这样就减少了出错的可能性。如果你的客户端是基于Java的,但是没有好的XML处理器(例如Android),那么我可能会使用FORM编码,因为内容主体比URL更容易生成和编码。希望这个迷你wiki条目能够揭示JAX-RS支持的各种方法。

注:为了充分披露信息,我还没有真正使用过Jersey的这个特性。我们正在修补它,因为我们已经部署了许多JAXB+JAX-RS应用程序,并且正在进入移动客户端领域。在HTML5或基于jQuery的解决方案中,JSON比XML更适合。

票数 364
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8194408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档