服务器以JSON格式发送数据作为HTTP POST,我使用jax-rs来处理和检索数据。
我可以根据我的需要使用@Pathparam或@queryparam,但数据并不喜欢其中任何一个。如果我是对的,也不在标题中,因为它们包含内容类型,日期和类似排序的内容。如何从POST检索数据?
@POST
@Path("/foo")
public void foo(){ //do i need to put sth in parameter paranthesis to get?
//handle the data!! but how??
}
答案 0 :(得分:5)
我建议你看看JAX-RS Entity Providers。我将向您解释如何分别对响应和请求流进行编组和解组。
基本上你有MessageBodyReader
和MessageBodyWriter
s(前者是来自请求流的unmarshall。工程怎么说你有这样的方法
@POST
@Consumes(MediaType.TEXT_PLAIN)
public Response postString(String s) {}
String s
与任何其他没有注释的方法参数一样,被视为请求的主体。 (注意一个方法只能有一个非注释参数;即一个请求只能有一个主体)。所以会发生什么是JAX-RS(实现)运行时将通过提供程序的注册表(确切地说是MessageBodyReader
)来查找可以处理将text/plain
类型的主体解组为{ {1}}。某些标准类型有一些标准阅读器,这是免费提供的阅读器。
现在在JSON的情况下,说我们有这个
String
这也可以,因为有一个编写者可以处理这个问题。基本上,String参数可以在大多数时间处理。将InputStream变为String并不困难,String参数我们通常会获得免费支持。
但是如果我们想要一个不同类型的unmarshal,比如说@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postJson(String json) {}
Foo
我们有像JSON一样的
class Foo {
String bar;
String baz;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postJson(Foo foo) {}
我们可以做到这一点,但我们需要一个自定义阅读器。幸运的是,有一些已经存在。我们只需要将库依赖项添加到项目中。例如,Jackson(我说Java中事实上的JSON处理器)为我们提供了一个阅读器。它在依赖
中{ "bar" : "barValue", "baz": "bazValue" }
我们可以将<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.5.0</version>
</dependency>
注册到我们的应用程序中。然后我们将能够使用JSON中的POJO。 (有关注册的更多帮助,请提供有关您正在使用的JAX-RS实现的更多信息,并显示您的应用程序配置,无论是web.xml还是Java配置)
部分资源: