4

私のコード(以下)は、少しリダイレクトを行うサーバーから返される最終的なURLを取得しようとします。URLにhttpスキームがある限り、正常に機能します。別のスキームでURLを返したいときに問題が発生します。これはAndroid向けであり、Intentsを使用して開始したいので、最終的には、状況によっては、market://urlまたは他のアプリ起動スキームを返したいと思います。

したがって、これで最終的なhttp urlを取得することができますが、最終的なURLがmarket://の場合、表示される例外がスローされ(java.lang.IllegalStateException:Scheme'market'が登録されていません)、getURIは提供しません。その1つ、それはその前にあったものは何でも提供します。

    DefaultHttpClient client = new DefaultHttpClient();
    HttpContext httpContext = new BasicHttpContext();
    HttpGet httpGet = new HttpGet(mInitialUrl);

    try {
        client.execute(httpGet, httpContext);
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }

    // Parse out the final uri. 
    HttpHost currentHost = (HttpHost) httpContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
    HttpUriRequest req = (HttpUriRequest) httpContext.getAttribute(ExecutionContext.HTTP_REQUEST);

    return (req.getURI().isAbsolute()) ? req.getURI().toString() : (currentHost.toURI() + req.getURI());

これで、market://をスキームとして登録することもできますが、有効なスキームが何であるかを事前にハードコーディングするのではなく、それらを受け入れて、それらが何であれ返すようにします。

何か案は?たぶん私は正しいアプローチをとっていません。(この場合、サーバーの動作を変更することはできません...リダイレクトに対処する必要があります。)

私の望みは、誰かがHttpClientにスキームを無視させる方法、または少なくともアクセスしようとする最終的なURIを保持する方法を教えてくれることです。

4

1 に答える 1

3

HttpURLConnection仕事に使うのは私にとってはうまくいきます。対象リソースがHTTPリソースでない場合、以下のリダイレクトは例外なく停止します。

HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection();
connection.setInstanceFollowRedirects(true);
String location = connection.getHeaderField("location");
于 2013-02-15T17:25:47.723 に答える