Android:如何发出HTTP HEAD请求?

时间:2014-03-20 18:10:16

标签: android http-head

我想做一个简单的HTTP HEAD请求,没有keep-alive。

如何在Android中执行此操作?

3 个答案:

答案 0 :(得分:9)

使用HttpClient

正如njzk2建议的那样,HttpClient()非常简单:

HttpResponse response = new HttpClient().execute(new HttpHead(myUrl));

然而,无法关闭连接存在问题。通常在HttpClient上,您可以使用:

获取实体
HttpEntity entity = response.getEntity();

然后你会得到来自实体的输入流

InputStream instream = entity.getContent();
...
instream.close();

并关闭输入流,连接将关闭。 但是,在HEAD请求的情况下,实体看起来是null(可能是因为HEAD请求没有在响应中返回正文),因此无法获取和关闭输入流,并且连接不会关闭。

在他的回答的最后一次编辑中,njzk2建议使用AndroidHttpClient,这是HttpClient的最新实现(API 8),它实际上有close()方法。我没有用它,但我想它会正常工作。但是,正如Android开发团队所建议的那样,HttpUrlConnection应该是首选的Android客户端。

使用HttpUrlConnection

实际上使用HEAD制作HttpUrlConnection请求似乎很容易,并确保连接关闭:

    HttpURLConnection urlConnection = null;
    System.setProperty("http.keepAlive", "false");
    try {
        URL url = new URL(stringUrl);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("HEAD");
        urlConnection.getInputStream().close();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
    }

答案 1 :(得分:2)

平凡:

HttpResponse response = new AndroidHttpClient().execute(new HttpHead(myUrl));

通常,您会为多个连接使用相同的AndroidHttpClient,然后在其上调用close

答案 2 :(得分:1)

适用于普通的Java和Android

我使用一些标准Java代码来测试资源是否存在,同时检查资源是否已更改,前提是参数if_modified_since为非零。

        URL url = new URL(adr);
        try {
            URLConnection con = url.openConnection();
            con.setIfModifiedSince(if_modified_since);
            if (con instanceof HttpURLConnection) {
                /* Workaround for https://code.google.com/p/android/issues/detail?id=61013 */
                con.addRequestProperty("Accept-Encoding", "identity");
                ((HttpURLConnection) con).setRequestMethod("HEAD");
                int response = ((HttpURLConnection) con).getResponseCode();
                if (response == HttpURLConnection.HTTP_UNAVAILABLE)
                    return false;
                if (response == HttpURLConnection.HTTP_NOT_MODIFIED)
                    return false;
            }
            if (if_modified_since != 0) {
                long modified = OpenOpts.getLastModified(con);
                if (modified != 0 && if_modified_since >= modified)
                    return false;
            }
            InputStream in = con.getInputStream();
            in.close();
            return true;
        } catch (FileNotFoundException x) {
            return false;
        } catch (UnknownHostException x) {
            return false;
        } catch (SocketException x) {
            return false;
        }

有趣的是,代码需要一个con.getInputStream(),我不会在这里得到一些错误。但我需要一些帮助代码,以满足指向JAR的URI。帮助代码是:

     private static long getLastModified(URLConnection con) 
                    throws IOException {
    if (con instanceof JarURLConnection) {
        return ((JarURLConnection) con).getJarEntry().getTime();
    } else {
        return con.getLastModified();
    }
}

如果是,可以通过一些专业化进一步优化代码 URI是模式文件:然后可以直接执行File.exists()和File.getLastModified()。

我们在这里不抛出ServiceUnvailable异常,我们基本上假设外部代码会捕获IOException然后假设为false getHead()的结果。