如何在filter方法中使用ContainerRequestContext获取REST api的有效负载

时间:2017-06-10 17:32:36

标签: java rest jersey jax-rs dropwizard

我有一个POST REST api的过滤器,我想在过滤器中提取我的有效载荷的下面部分。

{
      "foo": "bar",
      "hello": "world"
} 

过滤代码: -

public class PostContextFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext requestContext)
            throws IOException {
        String transactionId = requestContext.getHeaderString("id");
     // Here how to get the key value corresponding to the foo.  
        String fooKeyVal = requestContext. ??
    }
}

我没有看到任何使用ContainerRequestContext对象将有效负载转移到api的简单方法。

所以我的问题是如何获得与我的有效载荷中的foo键对应的键值。

1 个答案:

答案 0 :(得分:4)

尽管过滤器主要用于处理HTTP头,URI和/或HTTP方法等请求和响应参数,但拦截器旨在通过操纵实体输入/输出流来操纵实体。

ReaderInterceptor允许您操作入站实体流,即来自”流的流。使用Jackson来解析入站实体流,你的拦截器可能就像:

@Provider
public class CustomReaderInterceptor implements ReaderInterceptor {

    // Create a Jackson ObjectMapper instance (it can be injected instead)
    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context)
                      throws IOException, WebApplicationException {

        // Parse the request entity into the Jackson tree model
        JsonNode tree = mapper.readTree(context.getInputStream());

        // Extract the values you need from the tree

        // Proceed to the next interceptor in the chain
        return context.proceed();
    }
}

answer和此answer也可能与您的问题有关。