私は、特定の URL の GET および POST に最適な NSURLRequest (および付随するもの) 実装を試行錯誤して使用しています。
ただし、アプリが使用する URL を変更せずに URL のターゲットを移動したいので、DNS プロバイダー経由で Web ホップ リダイレクトを使用するつもりです。
これは GET リクエストに対しては正常に機能しますが、POST はハングするだけです...接続応答が受信されません。
リダイレクトを処理するための関連する iOS メソッドは、
-(NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
(リダイレクトの処理)に関する Apple のドキュメントによると、
デリゲートが connection:willSendRequest:redirectResponse: を実装していない場合、すべての正規の変更とサーバー リダイレクトが許可されます。
このメソッドを除外してもうまくいかないので、それは私の経験ではありません。リクエストは応答なしでハングします。
Apple はまた、willSendRequest の実装を提案しています (上記のリンクされた Apple のドキュメントを参照)。呼び出しは表示されますが、結果のリクエストはハングします。
willSendRequest の現在の実装は次のとおりです (以下を参照)。これはリダイレクトに従いますが、 はリクエストを POST ではなく GET であるかのように処理します。
問題は、HTTP リクエストが POST であるという事実がリダイレクトによって失われていることだと思います (リクエスト Body も転送するなど、さらに問題がある可能性があります)。
ここで何をすべきかわかりません。したがって、リダイレクトを受け取る POST を正しく処理する方法についてのアドバイスをいただければ幸いです。ありがとう。
-(NSURLRequest *)connection:(NSURLConnection *)connection
willSendRequest:(NSURLRequest *)request
redirectResponse:(NSURLResponse *)redirectResponse
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) redirectResponse;
int statusCode = [httpResponse statusCode];
NSLog (@"HTTP status %d", statusCode);
// http statuscodes between 300 & 400 is a redirect ...
if (httpResponse && statusCode >= 300 && statusCode < 400)
{
NSLog(@"willSendRequest (from %@ to %@)", redirectResponse.URL, request.URL);
}
if (redirectResponse)
{
NSMutableURLRequest *newRequest = [request mutableCopy]; // original request
[newRequest setURL: [request URL]];
NSLog (@"redirected");
return newRequest;
}
else
{
NSLog (@"original");
return request;
}
}
追加情報 1
willSendRequest が受け取る HTTP コードは 301 - 'Moved Permanently.
allHTTPHeaderFields を使用してヘッダー フィールドを抽出すると、最初に送信したリクエストにヘッダーがあることがわかります
HTTP header {
"Content-Length" = 244;
"Content-Type" = "application/json";
}
...そして、コピー/リダイレクトされたリクエストにはヘッダーがあり、
Redirect HTTP header {
Accept = "*/*";
"Accept-Encoding" = "gzip, deflate";
"Accept-Language" = "en-us";
"Content-Type" = "application/json";
}
...元のリクエストのコピーやスーパーセットのようには見えません。