【问题标题】:How to override response header in jersey client如何覆盖球衣客户端中的响应标头
【发布时间】:2011-10-07 16:01:34
【问题描述】:

我有一个 jersey 客户端,我正试图解组一个响应实体。问题是远程 Web 服务将 application/octet-stream 作为内容类型发回,因此 Jersey 不知道如何解组它(对于 XML 等返回的 text/html 有类似的错误)。我无法更改网络服务。

我想要做的是覆盖内容类型并将其更改为 application/json 以便 jersey 知道要使用哪个编组器。

我无法向 json marshaller 注册 application/octet-stream,因为对于给定的内容类型,我实际上可能会得到各种奇怪的东西。

【问题讨论】:

    标签: json rest jersey


    【解决方案1】:

    正如 laz 所指出的,ClientFilter 是要走的路:

    client.addFilter(new ClientFilter() {
        @Override
        public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
            request.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, "application/json");
            return getNext().handle(request);
        }
    });
    

    【讨论】:

    • 好的,这几乎就是我想要的。只是我想调整的是入站响应,而不是出站标头。因此,根据您的代码,这可以正常工作:client.addFilter(new ClientFilter() { @Override public ClientResponse handle(ClientRequest request) throws ClientHandlerException { ClientResponse response = getNext().handle(request); response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); return response; } });
    • @monkjack 如何在 jersey 2.0 中做到这一点?
    【解决方案2】:

    我不精通 Jersey 客户端 API,但您可以使用 ClientFilter 来执行此操作吗?也许您可以通过ClientRequest.getProperties().put(String, Object) 向请求添加一个属性,告诉ClientFilter 用什么Content-Type 覆盖响应。如果ClientFilter 找到覆盖属性,它会使用它,否则它不会改变响应。我不确定 ClientFilter 是否在任何解组之前被调用。希望是这样!

    编辑(您是否尝试过类似的操作):

    public class ContentTypeClientFilter implements ClientFilter {
        @Override
        public ClientResponse handle(ClientRequest request) throws ClientHandlerException {
            final ClientResponse response = getNext().handle(request);
    
            // check for overridden ContentType set by other code
            final String overriddenContentType = request.getProperties().get("overridden.content.type");
            if (overriddenContentType != null) {
                response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, overriddenContentType);
            }
            return response;
        }
    }
    

    【讨论】:

    • 我查看了 ClientFilter 但没有“setHeader”样式的方法,所以我拒绝了它。如果属性是同一件事,那么这将起作用。 Jersey 文档似乎表明使用过滤器创建一个新的 ClientResponse 但这比手动解组更多的代码。
    • 不能response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, (String) request.getProperties().get("customer.content.type"))还是不能这样修改header?
    【解决方案3】:

    在 Java 8 和 Jersey 2 下,您可以使用 lambda:

    client.register((ClientResponseFilter) (requestContext, responseContext) ->
                    responseContext.getHeaders().putSingle("Content-Type", "application/json"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      相关资源
      最近更新 更多