【问题标题】:Jersey REST: Importing headers from a Map into a WebResource instanceJersey REST:将标头从 Map 导入 WebResource 实例
【发布时间】:2011-07-21 15:51:04
【问题描述】:

我正在尝试接收任意一组 HTTP 标头并将其转储到 WebResource 实例中。 WebResource 接口允许使用查询参数来执行此操作,因为它同时提供了

        webResource.queryParam(key, value)

        webResource.queryParams(MultivaluedMap<String, String> queryMap)

但是,API 不允许对标头执行相同操作。只有一个功能,

            webResource.header(key, value)

允许为 HTTP 标头输入键值对,但没有功能

 webResource.headers(MultivaluedMap<String, String> headersMap)

为了解决这个问题,我尝试从 WebResource 中检索构建器并对其进行迭代,逐个添加标头

        WebResource.Builder builder = webResource.getRequestBuilder();
    for(Map.Entry<String, String> headersMapEntry : headersMap.entrySet()){
        builder = builder.header(
                       headersMapEntry.getKey(), headersMapEntry.getValue());
    }

但这似乎并没有解决我的问题。

有谁知道我可以如何使用 Jersey 解决问题,以便我可以将任意地图转储到我的 WebResource 的标题中?

谢谢, 大卫

【问题讨论】:

  • 如何迭代地图并单独设置标题不能解决问题?
  • 嘿克里斯托弗,你的问题正是我为什么这么难过。我使用上面的代码或“webResource.getRequestBuilder().header(key, value);”手动迭代或者它没有正确设置标头(我检查在 Wireshark 上发送的传出数据包),Jersey 源代码中的 getRequestBuilder() 仅仅是“返回新的 Builder()”,这让人怀疑这样做,但是如果您检查所有其他返回 Builder 的函数(cookie()、实体、...),它们也会使用 getRequestBuilder()。

标签: java rest jersey webresource


【解决方案1】:

事实证明,解决这个问题的唯一方法是首先使用 getRequestBuilder() 从 webResource 中提取 requestBuilder,然后使用 requestBuilder 构建并执行请求的其余部分。

【讨论】:

  • 没有线索。很久没用那个了。虽然我记得那是一个完全的惊喜。很想再回去看看。
【解决方案2】:

这篇文章通过示例更彻底地解释了这个问题和解决方案:http://juristr.com/blog/2015/05/jersey-webresource-ignores-headers/

【讨论】:

    【解决方案3】:

    因为如果您检索 RequestBuilder 或 PartialRequestBuilder 则无法触发实际请求,因此您必须检索:

    WebResource.Builder builder = webResource.getRequestBuilder();
    

    WebResource.Builder有get、post等:

    response = builder.post(ClientResponse.class, body);
    

    【讨论】:

      猜你喜欢
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2018-01-14
      • 1970-01-01
      相关资源
      最近更新 更多