【问题标题】:Detect a url is accessible using HTTP requests检测可使用 HTTP 请求访问的 url
【发布时间】:2013-11-11 00:49:26
【问题描述】:

首先是我理解的事情:

1) 我可以发送一个 HTTP HEAD 请求,一个 200/2XX 响应码意味着内容可以在那里访问。

2) 我可以发送带有“Range”标头的 HTTP GET 请求,并且 206 响应代码表示内容可访问。

但是,如果给定的服务器不支持 HEAD 请求并且它不符合 Range 标头,更重要的是特定文件是一个非常大的文件。检查文件是否可访问的最佳方法是什么?显然我不想等待 10 分钟来下载整个文件。

我在 Google AppEngine 上使用带有基本 HttpUrlConnection 的 Java,因此某些特定库可能无法在此平台上运行。

我正在考虑最好的方法是发出 GET 请求并在第一个字节得到回复后终止它。但是,我找不到通过使用HttpUrlConnection 来实现此目的的方法。

希望有人在这里提供一些提示。

【问题讨论】:

  • 也许您可以尝试GET 加上If-Modified-Since 标头与未来日期(?)。如果内容存在且未被修改,它将以 304 响应。这可能不适用于在服务器端动态生成的内容。但是您提到它们是特定文件,因此,它可能会在服务器上具有最后修改的时间戳。

标签: java google-app-engine http-headers httprequest httpurlconnection


【解决方案1】:

在读取响应码等后尝试HttpURLConnection.disconnect()

服务器在发送大文件时,会收到来自客户端的 RST,并中止其连接。

【讨论】:

  • 谢谢@zhong.j.yu,我也想过同样的事情,但是在调用connection.getResponseCode()之后发生了什么,线程会一直运行直到所有内容都被检索到。除非我在这里做多线程并使用另一个线程来监控和调用disconnect(),否则我认为这不是一个可行的解决方案。
  • 不应该。断开连接应该能够释放一切。
  • 是的,它会释放一切,但只有在被调用之后。问题是即使您只调用 connection.getResponseCode(),在内容完全下载之前它也不会被调用。
  • 似乎 getResonseCode() 只需要标头,而不需要响应的正文。所以它应该很快返回而不下载整个内容。
  • 嗯,实际上,至少从我的测试来看,情况并非如此。初始化连接并发出 GET 请求后,只要套接字连接,服务器就会开始“推送”内容。
猜你喜欢
  • 1970-01-01
  • 2018-10-24
  • 2017-03-22
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多