【问题标题】:HTTP Get: Only download the header? (HEAD is not supported)HTTP Get:仅下载标头? (不支持 HEAD)
【发布时间】:2012-02-09 18:20:07
【问题描述】:

在我的代码中,我使用一些 Http Get 请求将一些文件下载为流。我使用以下代码:

public String getClassName(String url) throws ClientProtocolException, IOException {
        HttpResponse response = sendGetRequestJsonText(url);

        Header[] all = response.getAllHeaders();
        for (Header h : all) {
            System.out.println(h.getName() + ": " + h.getValue());
        }

        Header[] headers = response.getHeaders("Content-Disposition");
        InputStreamParser.convertStreamToString(response.getEntity().getContent());
        String result = "";
        for (Header header : headers) {
            result = header.getValue();
        }
        return result.substring(result.indexOf("''") + "''".length(), result.length()).trim();
    }

但这会下载响应的全部内容。我只想检索没有内容的 http 标头。 HEAD 请求似乎不起作用,因为那时我得到状态 501,未实现。我该怎么做?

【问题讨论】:

  • 只是不阅读响应正文?
  • @irreputable 如果我知道怎么做,我会这样做;)
  • InputStreamParser.convertStreamToString(response.getEntity().getContent()); 是读取实体的内容;你可能不这样做?
  • 然后我得到一个错误,因为内容没有被消费

标签: java apache http http-get


【解决方案1】:

您可以考虑只发出 HEAD 请求,而不是发出 GET 请求:

HEAD 方法与 GET 相同,只是服务器不能 在响应中返回消息体。包含的元信息 在响应 HEAD 请求的 HTTP 标头中应该是相同的 响应 GET 请求而发送的信息。这种方法可以 用于获取有关实体隐含的元信息 请求而不传输实体主体本身。这种方法是 通常用于测试超文本链接的有效性、可访问性、 以及最近的修改。

【讨论】:

  • 这个我试过了,但是header现在看起来不一样了:(我再次检查,状态码是501,没有实现。所以我的服务器似乎没有处理这样的请求。还有其他可能吗?跨度>
  • @Roflcoptr - 太蹩脚了。您可能能够使用Range 标头来请求实体的0-0 范围。但我从来没有使用过Range 标头或部分响应,所以我真的不能说。也许其他人可以插话。此外,服务器也可能会忽略这些标头。
  • 现在我找到了解决方法。我提出了一个获取请求,但是一旦我收到标头,我就会调用中止。这是好的做法吗?
  • @Roflcoptr - 听起来……粗略。我想我不知道这样做会产生什么后果,但它给了我一种不好的感觉。
【解决方案2】:

您可以在请求中使用Range header 来指定要包含在响应实体中的字节范围。可能是这样的:

Range: bytes=0-0

如果它确实有效,您应该收到一个206 Partial Content,其中包含在响应实体中的Range 标头中指定的字节。但是,我没有尝试过,而且它也不能保证工作:

服务器可以忽略 Range 标头。

【讨论】:

  • 服务器实现 Range 而不是 HEAD 有什么奇怪的?此外,范围 0-0 涵盖 1 个字节。
  • @irreputable - 是的,这也是我的想法;鉴于未实现的HEAD,服务器很可能不会提供此功能。至于 1 字节的东西,RFE2616(第 14.35.1 节)说:“如果存在 last-byte-pos 值,它必须大于或等于第一个-该字节范围规范中的字节位置,或者字节范围规范在语法上无效。” - 对我来说,这表示 0 字节范围是有效的。
  • 0-0 有效,但表示1字节,第0字节。您不能请求 0 个字节; 206 响应不能返回 0 字节。这确实有点奇怪。尽管在实践中,请求 0 字节是没有用的;但不能这样做是违背程序员的本能的。
  • @irreputable - 再读一遍,这是有道理的(考虑到范围是包容性的)。我想如果 OP 试图限制传输的字节数,0 好于 1 好于 10,000(或整个实体)。因此,减少传输的字节数可能就足够了。
猜你喜欢
  • 2020-12-06
  • 2023-02-05
  • 1970-01-01
  • 2019-08-28
  • 2020-08-06
  • 2019-08-31
  • 2021-05-05
相关资源
最近更新 更多