1

我有一个格式为 schema://hostname 的 URL(例如https://some.server.com)。
我正在尝试获取重定向页面(在我的情况下为登录表单)(例如 httpx://some.server.com/this/is/you/loginpage)

浏览器将自动重定向到此页面,该页面通过响应中的“位置”标头从服务器接收。在 Google Chrome 中分析此请求时,我看到带有位置标头的“302”状态。此位置标头具有正确的 URL,但由于某种原因,我无法使用 NSURLConnectionDelegate 方法检索此标头(或 http 状态!)。我也尝试过 AFNetworking,但结果相同。

在这种情况下,connection:willSendRequest:redirectResponse: 方法仅用于规范更改,而不用于位置更改。

我还发现 UIWebView 会自动重定向到这个“位置”URL。我还能够使用 UIWebView 委托方法捕获此重定向: webView:shouldStartLoadWithRequest:navigationType: 我不想使用 UIWebView 因为这是一个只能在主线程中访问的 UI 组件,而我正在做一些后台操作。(但是我现在使用它作为解决方法)。

此处还描述了所需的行为:http ://en.wikipedia.org/wiki/HTTP_location 任何想法如何使用 NSURLConnection (或任何 AFNetworking 类)检测/执行此重定向?

使用 NSURLConnection 的相关代码(在这种情况下不重定向):

- (void)resolveUsingNSURLConnection:(NSURL *)URL {
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    self.isRequestBusy = YES;
    NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (urlConnection) {
        [self waitUntilRequestFinished];
    }

    NSLog(@"resolveUsingNSURLConnection ready (status: %i, URL: %@)", self.response.statusCode, self.response.URL);
}

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse {
    if (redirectResponse) {
        // Just log the redirect request
        NSLog(@"[%@] server redirect allowed:\n\t%@ %@\n\t%@ %@", NSStringFromClass([self class]), self.request.HTTPMethod, self.request.URL.absoluteString, request.HTTPMethod, request.URL.absoluteString);
        return request;
    } else {
        // Just log the canonical change
        NSLog(@"[%@] canonical change:\n\t%@ %@\n\t%@ %@", NSStringFromClass([self class]), self.request.HTTPMethod, self.request.URL.absoluteString, request.HTTPMethod, request.URL.absoluteString);
        return request;
    }
}

使用 UIWebView 的相关代码(具有所需的重定向行为,而不是所需的组件):

- (void)resolveUsingUIWebView:(NSURL *)URL {
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(resolveUsingUIWebView:) withObject:URL waitUntilDone:YES];
        return;
    }

    NSURLRequest *hostnameURLRequest = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];
    self.isRequestBusy = YES;
    UIWebView *webview = [[UIWebView alloc] initWithFrame:CGRectZero];
    webview.delegate = self;
    [webview loadRequest:hostnameURLRequest];
    [self waitUntilRequestFinished];

    NSLog(@"resolveUsingUIWebView ready (status: UNKNOWN, URL: %@)", webview.request.URL);
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSLog(@"webView:shouldStartLoadWithRequest: %@ (%i)", request.URL, navigationType);
    return YES;
}
4

1 回答 1

2

UIWebView 处理重定向的方式有几种不同的方式,我见过,其中几种是:

Web 服务可能会检查 User-Agent 字符串并采取不同的行动。

重定向可能是 JaveScript。

于 2013-11-11T21:36:26.670 回答