您的@POST
方法应该接受JSON对象而不是字符串。Jersey使用JAXB支持封送和解封JSON对象(有关详细信息,请参阅jersey文档)。创建一个类似的类:
@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来实现这一点。我相信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¶m2=world
在这种情况下,内容是URL编码的。
如果您不知道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¶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
此方法与查询参数版本共享相同的编码问题。 路径段的编码方式不同,因此您也必须在此处格外小心。
如您所见,每种方法各有利弊。选择通常由您的客户决定。如果您正在提供FORM
基于HTML的HTML页面,请使用@FormParam
。如果您的客户端基于JavaScript + HTML5,则您可能希望使用基于JAXB的序列化和JSON对象。这些MessageBodyReader/Writer
实现应为您处理必要的转义操作,以免出错。如果您的客户端基于Java,但没有良好的XML处理器(例如Android),则我可能会使用FORM
编码,因为内容主体比URL更易于正确生成和编码。希望这个微型Wiki条目可以阐明JAX-RS支持的各种方法。
注意:为了全面披露,我尚未实际使用Jersey的此功能。因为我们已经部署了许多JAXB + JAX-RS应用程序,并且正在向移动客户端空间迁移,所以我们对此进行了修补。JSON比XML更好地适合HTML5或基于jQuery的解决方案。