我有一个格式为 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;
}