我正在尝试解决以下问题: 我发送一个带有一些额外标头值的POST请求到特定的URL。为此,我使用NSMutabeURLRequest。当我NSLog响应时,它工作得很好,但我还需要重定向的URL。如果我在competitionHandler中使用了类似request.URL的东西,它会返回我发送POST请求的URL,这不是我需要的。
有关如何获取重定向网址的任何提示? (如果它不会显着改变我的代码,那就太好了。
以下是我到目前为止:
url = [NSURL URLWithString:@"https://***"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
//Some additional values are set here
[request setHTTPBody:data];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"%@", response);
if (error)
NSLog(@"%s: NSURLConnection error: %@", __FUNCTION__, error);
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"responseString: %@",responseString);
}];
答案 0 :(得分:0)
来自Apple的开发者文档:
当服务器通过指示客户端应向其他URL发出新请求来响应请求时,会发生重定向。发生这种情况时, NSURLSession , NSURLConnection 和 NSURLDownload 类会通知其代理。
要处理重定向,您的URL加载类委托必须实现以下委托方法之一:
对于 NSURLSession ,实现URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:delegate method。
对于 NSURLConnection ,实现连接:willSendRequest:redirectResponse:delegate方法。
对于 NSURLDownload ,请实施下载:willSendRequest:redirectResponse:delegate方法。 在这些方法中,委托可以检查新请求和导致重定向的响应,并可以通过 NSURLSession 的完成处理程序或通过 NSURLConnection <的返回值返回新的请求对象。 / strong>和 NSURLDownload 。
代表可以执行以下任何操作:
只需返回提供的请求即可允许重定向。 创建一个新请求,指向不同的URL,并返回该请求。 通过返回nil拒绝重定向并从连接接收任何现有数据。 此外,代理可以取消重定向和连接。使用 NSURLSession ,委托通过向任务对象发送取消消息来完成此操作。使用 NSURLConnection 或 NSURLDownload API,代理通过将取消消息发送到NSURLConnection或NSURLDownload对象来完成此操作。
代理还接收连接:willSendRequest:redirectResponse:消息,如果处理请求的NSURLProtocol子类已更改NSURLRequest以标准化其格式,例如,将http://www.apple.com的请求更改为{{3 }}。发生这种情况是因为请求的标准化或规范版本用于缓存管理。在这种特殊情况下,传递给委托的响应为nil,委托应该只返回提供的请求。
基本上,你需要使用连接:willSendRequest:redirectResponse:delegate方法来获取新的url并执行你需要的任何操作
答案 1 :(得分:0)
问题是您正在使用sendAsynchronousRequest:queue:completionHandler:方法,该方法使用完成处理程序而不接受委托。
实现委托方法之后,您需要使用NSURLConnection的initWithRequest:delegate:或initWithRequest:delegate:startImmediately:方法来创建NSURLConnection对象。您还必须实现委托方法以获取请求返回的数据。
或者,如果您不必支持早于iOS 7或OS X v10.9的任何内容,NSURLSession提供了使用委托方法处理重定向的功能,即使与完成回调的方法结合使用也是如此。