Android:我怎样才能发出HTTP头请求?

Android:我怎样才能发出HTTP头请求?,android,http-head,Android,Http Head,我想做一个简单的HTTP头请求,不需要保持活动状态 在安卓系统中如何做到这一点?很简单: HttpResponse response = new AndroidHttpClient().execute(new HttpHead(myUrl)); 通常,您将使用相同的AndroidHttpClient进行多个连接,然后在其上调用close。使用HttpClient: 正如njzk2所建议的,使用HttpClient()非常简单: HttpResponse response = new HttpC

我想做一个简单的HTTP头请求,不需要保持活动状态

在安卓系统中如何做到这一点?

很简单:

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

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

使用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

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

    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();
        }
    }

适用于普通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()

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

谢谢!在此之后,默认情况下会关闭连接吗?或者我需要阅读响应吗?标题在HttpResponse中。您不需要关闭连接。实际上,我可以在服务器上(使用“netstat”)验证连接是否保持“已建立”状态。是否有方法使用
HttpDefaultClient
明确关闭连接?在
HttpUrlConnection
上,您可以使用
disconnect()
明确地关闭连接。是否可以使用
HttpUrlConnection
发出HEAD请求?实际上,有一个
AndroidHttpClient
具有一个
close
方法来释放所有连接。我发现使用
HttpUrlConnection
设置
HEAD
请求实际上很容易,您只需要添加:
httpUrlConnection.setRequestMethod(“HEAD”)
还有
entity.consumeContent()
问题是,当使用
HttpClient
发出
HEAD
请求时,实体是
null
我真的不明白为什么连接会保持打开状态。我已经使用HttpClient很长一段时间了,我对它非常满意。服务器似乎从未被未关闭的连接淹没。只要您可以关闭连接,
HttpClient
就可以了,GET、POST、PUT都会发生这种情况。但是对于HEAD请求,连接不是由客户端关闭的,需要由服务器关闭。这意味着服务器端的这些连接必须进入TIME_WAIT状态,默认情况下,该状态持续60秒,然后才允许重复使用相同的套接字。但是,如果客户端关闭了连接,服务器就不必在等待的时候锁定这些套接字,并且可以立即重用它们。我不明白为什么服务器在发送响应后(即,当它拥有最后一个数据包的TCP ack时)会保持头连接(或任何HTTP连接)打开