4

のドキュメントを読むと、読み込み中に発生した可能性のあるリダイレクトNSURLConnectioncurrentRequestメソッドに反映されているはずです。

接続がロードを実行すると、プロトコルの正規化の結果として、または次のリダイレクトにより、リクエストが変更される場合があります。このメソッドは、現在の値を取得するために使用されます。

ただし、を調べると、応答データを調べるとリダイレクトが正常に完了したことが示されていても、常に元の要求の URL が含まcurrentRequestれています。connectionDidFinishLoading:(以下の不自然な例を参照)

currentRequest私の質問はこれです:実際の現在のリクエストを返さないのはなぜですか? 私は何か間違ったことをしていますか、それともこれは予想される動作ですか? これ予想される動作である場合、何currentRequestに役立つと思われますか?

@interface AppDelegate : UIResponder <UIApplicationDelegate, NSURLConnectionDataDelegate>
@property (strong, nonatomic) NSURLConnection *connection;
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSURL *url = [[NSURL alloc] initWithString:@"http://jigsaw.w3.org/HTTP/300/301.html"];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    return YES;
}

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
    NSLog(@"willSendRequest // request: %@ // currentRequest: %@", request, [connection currentRequest]);
    return request;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"didFinishLoading // originalRequest: %@ // currentRequest: %@", [connection originalRequest], [connection currentRequest]);
}

@end

この例を実行すると、次の出力が得られます。

2012-12-18 15:18:44.949 ConnectionTest[12534:c07] willSendRequest // request: <NSURLRequest http://jigsaw.w3.org/HTTP/300/301.html> // currentRequest: <NSURLRequest http://jigsaw.w3.org/HTTP/300/301.html>
2012-12-18 15:18:44.954 ConnectionTest[12534:c07] willSendRequest // request: <NSURLRequest http://jigsaw.w3.org/HTTP/300/Overview.html> // currentRequest: <NSURLRequest http://jigsaw.w3.org/HTTP/300/301.html>
2012-12-18 15:18:44.955 ConnectionTest[12534:c07] didFinishLoading // originalRequest: <NSURLRequest http://jigsaw.w3.org/HTTP/300/301.html> // currentRequest: <NSURLRequest http://jigsaw.w3.org/HTTP/300/301.html>

への最後の呼び出しでは、 でcurrentRequest終わるページ URL が表示されると予想されますOverview.htmlが、代わりに301.html.

4

3 に答える 3

3

これは、Apple がドキュメントを混乱させなければならないせいだと思います。応答オブジェクトを調べることで最終的な要求 URL を取得できますが、呼び出されたものはcurrentRequest、リダイレクト後に行われた最後の要求を反映しているはずです。

于 2012-12-30T20:20:49.630 に答える
2

リダイレクトはどのように発生しますか? http サーバーはリダイレクト ステータスを返していますか?

元の URL 要求はおそらく変更可能なものではないため、システムは URL を変更できません。

ここの回答で説明されているように、リダイレクトごとに新しいリクエストを作成する必要があります: NSURLConnection でリダイレクトを正しく処理する

接続からではなく、応答オブジェクトから最終的な URL を取得します。たとえば、私が作成したこの URL unshortener を参照してください: http://www.cocoanetics.com/2012/06/mine-is-longer-than-yours/

于 2012-12-30T09:10:53.490 に答える
0

私は Iphone 開発者ではありません (Mac のみ) が、ほとんどの NSURLConnectionDelegate メソッドは iOS5 で廃止されたようで、NSURLDownload (およびそのデリゲート) がこれを行う新しい方法のようです: NSURLConnectionDelegate NSURLDownloadDelegate

于 2012-12-19T05:50:01.253 に答える