【问题标题】:retrieve data from post in JAX-RS从 JAX-RS 中的帖子中检索数据
【发布时间】:2015-07-04 16:27:51
【问题描述】:

服务器以 HTTP POST 形式发送 JSON 数据,我使用 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??
}

【问题讨论】:

    标签: java rest jax-rs


    【解决方案1】:

    我建议你看看JAX-RS Entity Providers。我将向您解释如何分别对响应和请求流进行编组和解组。

    基本上你有MessageBodyReaders 和MessageBodyWriters(前者是从请求流中解组的那个。工作原理说你有这样的方法

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    public Response postString(String s) {}
    

    String s 与任何其他没有注释的方法参数一样被视为请求的主体。 (注意一个方法只能有一个非注释参数;即一个请求只能有一个主体)。因此,JAX-RS(实现的)运行时将查看提供者的注册表(确切地说是MessageBodyReaders),以寻找可以处理将text/plain 类型的主体解组为String 的提供者。一些标准类型有一些标准阅读器,这是免费提供的。

    现在对于 JSON,假设我们有这个

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response postJson(String json) {}
    

    这也可以做到,因为有一个作家可以处理这个问题。基本上大部分时间都可以处理字符串参数。把 InputStream 做成 String 并不难,String 参数我们通常会免费获得支持。

    但是如果我们想解组为不同的类型,比如Foo

    class Foo {
        String bar;
        String baz;
    }
    
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response postJson(Foo foo) {}
    

    我们有类似 JSON 的

    { "bar" : "barValue", "baz": "bazValue" }
    

    我们可以这样做,但我们需要一个自定义阅读器。幸运的是,已经有一些了。我们只需要将库依赖项添加到 out 项目中。例如,Jackson(我会说 Java 中事实上的 JSON 处理器)为我们提供了一个阅读器。它在依赖项中

    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>2.5.0</version>
    </dependency>
    

    我们可以将JacksonJsonProvider 注册到我们的应用程序中。然后我们将能够使用来自 JSON 的 POJO。 (有关注册的更多帮助,请提供有关您正在使用的 JAX-RS 实现的更多信息,并显示您的应用程序配置,无论是 web.xml 还是 Java 配置)

    一些资源:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多