5

キープアライブなしで、単純な HTTP HEAD リクエストを作成したいと思います。

どうすればAndroidでそれを行うことができますか?

4

3 に答える 3

1

通常の Java と Android の場合

パラメータ if_modified_since がゼロ以外の場合、標準の Java コードを使用してリソースの存在をテストし、同時にリソースが変更されたかどうかを確認しています。

        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 が schema file: である場合、コードは何らかの特殊化によってさらに最適化できます。その後、直接 File.exists() および File.getLastModified() を実行できます。

ここでは ServiceUnvailable 例外をスローしません。基本的には、外側のコードが IOException をキャッチし、getHead() の結果が false であると想定します。

于 2016-08-14T15:52:43.840 に答える
1

自明:

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

通常AndroidHttpClient、複数の接続に同じものを使用してから、それを呼び出しますclose

于 2014-03-20T18:11:43.027 に答える