私のコード(以下)は、少しリダイレクトを行うサーバーから返される最終的な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を保持する方法を教えてくれることです。