私は HttpURLConnection を使用してバックエンド サーバーと通信していますが、必要に応じて doInBackground メソッドの非同期タスクで通信しています。
302 リダイレクトを追跡できるようにする必要がありますが、これにはいくつか問題があります。問題は、通常、新しい場所が別のホストにあることですが、リダイレクト要求を実行するときに URL を新しいホストに変更していないように見えるため、指定されたパスが存在しないという 404 エラーが発生します。
これで、HtppURLConnection.setFollowRedirect を設定できることがわかりましたが、リダイレクトをより詳細に制御する必要があるため、リダイレクトを盲目的に追跡しないようにする必要があります。リダイレクトの動作は、asynctask を呼び出したオブジェクトによって制御する必要があります (asynctask オブジェクトが作成されると、それを作成したオブジェクトを _callback というパラメーターで渡します)。
これが私の現在のコードです:
protected HttpResponse doInBackground(String... req) {
HttpURLConnection urlConnection = null;
try {
urlConnection = (HttpURLConnection) this._url.openConnection();
urlConnection.setConnectTimeout( (int) this._timeout*1000);
String body = req[0];
// set headers / write information to output stream if request is post
// create the response object
HttpResponse responseObject = null;
try
{
// get status, contenttype, charset...
InputStream in = null;
if (urlConnection.getResponseCode() != -1 && urlConnection.getResponseCode() < 300)
{
in = new BufferedInputStream(urlConnection.getInputStream(), 8192);
}
else
{
in = new BufferedInputStream(urlConnection.getErrorStream(), 8192);
}
responseObject = new HttpResponse(in, status, contentType, charset);
// if redirect
if (status == 302 && this._callback.onRedirect(responseObject) == true)
{
// recall
String url = urlConnection.getHeaderField("location");
Log.v("Async Task", "Redirect location: " + url);
this._url = null;
this._url = new URL(url);
urlConnection.disconnect();
urlConnection = null;
responseObject = this.doInBackground(req);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// return the response
return responseObject;
}
// catch some other exceptions
finally
{
if (urlConnection != null)
{
urlConnection.disconnect();
} }
}
前述のように、問題は、リダイレクト要求が URL のパスを変更しているように見えますが、ホストは変更していないように見えることです。URL オブジェクト自体に正しい情報が含まれているように見えるので、なぜこれが起こっているのかわかりません。(古いサーバーのサーバー名を含む404エラーページであるHTMLを応答として取得しています)
助けてくれてありがとう!
注: HttpResponse は、応答に関する関連情報を保持するために作成した単なるオブジェクトです。