从NSURLConnection重定向URL

时间:2015-08-19 14:36:47

标签: ios redirect request nsurlconnection

我正在尝试解决以下问题: 我发送一个带有一些额外标头值的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);

}];

2 个答案:

答案 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提供了使用委托方法处理重定向的功能,即使与完成回调的方法结合使用也是如此。