iOS中实现url重定向

以京东为例,展示url重定向

重定向对应的HTTP状态码

  • 301
    • 代表永久转移(Permanently Moved)
    • 涉及到网址修改的,就需要使用301(如京东的的网址修改),网址更改后对搜索引擎友好的处理方法
  • 302
    • 代表临时转移(Temporarily Moved )
    • 重定向只是临时性转移,只是临时跳转,而不是永久的更改

iOS中实现url重定向的两种方法

NSURLSession实现url重定向(推荐
  • 代码实现
#import "ViewController.h"

@interface ViewController ()<NSURLSessionTaskDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self requestByURLSession];
}

- (void)requestByURLSession {
    NSURL *url = [NSURL URLWithString:@"https://www.360buy.com"];
    NSMutableURLRequest *quest = [NSMutableURLRequest requestWithURL:url];
    quest.HTTPMethod = @"GET";

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue currentQueue]];
    NSURLSessionDataTask *task = [urlSession dataTaskWithRequest:quest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
                                  {
                                      NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
                                      NSLog(@"请求成功后的回调===>\nstatus Code: %ld\nHeader Fields: \n%@", urlResponse.statusCode, urlResponse.allHeaderFields);
                                  }];
    [task resume];
}

#pragma mark - NSURLSessionTaskDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * __nullable))completionHandler
{
    NSDictionary *headers = response.allHeaderFields;
    // 获取重定向后请求地址的两种方式:headers[@"Location"] 和 [request URL]
    NSLog(@"请求重定向回调===>\nstatus Code: %ld\nHeader Fields: \n%@\n重定向【前】的请求地址: %@\n重定向【后】的请求地址: %@\n", response.statusCode, headers, [response URL], [request URL]);

    completionHandler(request);
//    completionHandler(nil);// 通过设置参数为nil,可以【禁止/拦截】重定向
}

@end
  • 测试结果如下图:


    NSURLSession实现url重定向(推荐)
NSURLConnection实现url重定向
  • 代码实现
#import "ViewController.h"

@interface ViewController ()<NSURLConnectionDataDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self requestByURLConnection];
}

- (void)requestByURLConnection {
    NSURL *url = [NSURL URLWithString:@"https://www.360buy.com"];
    NSMutableURLRequest *quest = [NSMutableURLRequest requestWithURL:url];
    quest.HTTPMethod = @"GET";

    NSURLConnection *connect = [NSURLConnection connectionWithRequest:quest delegate:self];
    [connect start];
}

#pragma mark - NSURLConnectionDataDelegate
- (nullable NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response
{
    NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
    NSDictionary *headers = urlResponse.allHeaderFields;
    NSLog(@"请求重定向回调===>\nstatus Code: %ld\nHeader Fields: \n%@\n重定向【前】的请求地址: %@\n重定向【后】的请求地址: %@\n", urlResponse.statusCode, headers, [urlResponse URL], [request URL]);

    return request;
}

@end
  • 测试结果如下图:


    NSURLConnection实现url重定向

推荐阅读更多精彩内容

  • 先看看wiki http状态码的解释。   301 Moved Permanently 被请求的资源已永久移动到新...
    杰哥长得帅阅读 4,964评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 103,703评论 13 125
  • 在nginx中配置,使得访问不带www的网址自动重定向到带www的域名。 http协议的重定向 在nginx官方文...
    nfer阅读 10,818评论 2 1
  • 老生常谈-从输入url到页面展示到底发生了什么2017-04-10 咸鱼老弟 Web开发来自:咸鱼老弟 - 博客园...
    __Seve阅读 394评论 0 4
  • 活着的意义 现在,并不难想象为什么有些人会得精神病。 当这个世界,没有人再去听你的心声,一个人的生活,就是两种选择...
    茗香淡淡阅读 46评论 0 0