您的方法应接受 JSON 对象而不是字符串。Jersey 使用 JAXB 来支持封送处理和取消marshaling JSON 对象(有关详细信息,请参阅 Jersey 文档)。创建一个类似如下的类:@POST
@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 消息的内容正文作为未注释的参数传递 -- 在本例中。实际消息将如下所示:input
POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com
{"param1":"hello","param2":"world"}
由于显而易见的原因,以这种方式使用JSON非常普遍。但是,如果您在JavaScript以外的其他事物中生成或使用它,那么您必须小心正确转义数据。在 JAX-RS 中,您将使用 MessageBodyReader 和 MessageBodyWriter 来实现这一点。我相信泽西岛已经为所需的类型(例如,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¶m2=world
在这种情况下,内容是 URL 编码的。
如果您不知道表单参数的名称,可以执行以下操作:
@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 GETs,但它同样适用于 POST。它使用@QueryParam注释。
@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
@QueryParam("param2") String param2) {
...
}
与前面的技术一样,通过查询字符串传递参数不需要消息正文。下面是 HTTP 消息:
POST /create?param1=hello¶m2=world HTTP/1.1
Content-Length: 0
Host: www.example.com
您必须特别小心,以便在客户端正确编码查询参数。由于某些代理强制实施的 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
此方法与查询参数版本具有相同的编码问题。路径段的编码方式不同,因此您也必须小心。
如您所见,每种方法都有优点和缺点。选择通常由您的客户决定。如果要提供基于 HTML 的网页,请使用 。如果您的客户端是基于 JavaScript+HTML5 的,那么您可能希望使用基于 JAXB 的序列化和 JSON 对象。实现应该为您处理必要的转义,以便减少可能出错的事情。如果您的客户端是基于Java的,但没有一个好的XML处理器(例如Android),那么我可能会使用编码,因为内容正文比URL更容易生成和正确编码。希望这个迷你维基条目能阐明 JAX-RS 支持的各种方法。FORM
@FormParam
MessageBodyReader/Writer
FORM
注意:为了充分披露,我还没有实际使用泽西岛的此功能。我们一直在修补它,因为我们部署了许多 JAXB+JAX-RS 应用程序,并且正在进入移动客户机领域。JSON更适合HTML5或基于jQuery的解决方案上的XML。