如何在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);
}
运行此测试时:
@Testpublic 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对象(有关详细信息,请参阅jersey文档)。创建一个类似的类:
@XmlRootElementpublic 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 input在此情况下将HTTP消息的内容主体作为未注释的参数传递。实际消息如下所示:
POST /create HTTP/1.1Content-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