美文网首页
iOS HTTP网络请求Cookie的读取与写入(NSHTTPC

iOS HTTP网络请求Cookie的读取与写入(NSHTTPC

作者: Lee坚武 | 来源:发表于2020-09-17 10:45 被阅读0次

    当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的Cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的Cookie继续去请求。
    同样适用于ASIHTTPRequest,AFNetworking, Webview等,Cookie常用于一些基于认证的网络请求

    认识下NSHTTPCookieStorage
    NSHTTPCookieStorage 实现了一个管理cookie的单例对象(只有一个实例),每个Cookie都是NSHTTPCookie类的实例,作为为一个规则,Cookie在(macOS)所有应用之间共享并在不同进程之间保持同步,在iOS中不会多应用共享。Session Cookie(一个isSessionOnly方法返回YES的Cookie)只能在单一进程中使用。

    Cookie
    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器或者客户端),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站地址时就发送该Cookie给服务器

    HTTP header
    HTTP header中包含HTTP请求与响应的操作参数. header属性定义了所传输数据的各种特性. header属性以属性名开始,以冒号结尾,最后是属性值.属性名及值会因应用的不同

    一.iOS htttp网络请求Cookie的读取与写入:
    Cookie必然会通过HTTP的Respone传过来,并且Cookie在Respone中的HTTP header中。不管是什么请求框架,必然会存在Respone对象,比如AFNetworking2.x的operation.response,AFNetworking3.x的task.response等等。。。。

    1.原生NSURLConnection写法

    一.获取cookie
    - (IBAction)cookieTouched:(id)sender {
        NSURL *url = [NSURL URLWithString:@"http://api.skyfox.org/api-test.php"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url]
                                                 cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                             timeoutInterval:3];
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
        [NSURLConnection sendAsynchronousRequest:request
                                           queue:queue
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
                                  
                                   //转换NSURLResponse成为HTTPResponse
                                   NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
                                   //获取headerfields
                                   NSDictionary *fields = [HTTPResponse allHeaderFields];//原生NSURLConnection写法
                                   // NSDictionary *fields = [operation.response allHeaderFields]; //afnetworking写法
                                   NSLog(@"fields = %@",[fields description]);
    
                                   //获取cookie方法1
                                   // NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:url];
                                   //获取cookie方法2
                                   //NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"];
                                   //获取cookie方法3
                                   NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
                                   for (NSHTTPCookie *cookie in [cookieJar cookies]) {
                                       NSLog(@"cookie%@", cookie);
                                   }
                               }];
        
    }
    

    2.AFNetworking 写法

     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        manager.responseSerializer = [AFCompoundResponseSerializer serializer];
        //demo中的api返回的是html数据,不是json
        [manager POST:@"http://dev.skyfox.org/cookie.php" parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            NSLog(@"\n======================================\n");
            NSDictionary *fields = ((NSHTTPURLResponse*)task.response).allHeaderFields;
            NSLog(@"fields = %@",[fields description]);
            NSURL *url = [NSURL URLWithString:@"http://dev.skyfox.org/cookie.php"];
            NSLog(@"\n======================================\n");
            //获取cookie方法1
            NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:url];
            for (NSHTTPCookie *cookie in cookies) {
                NSLog(@"cookie,name:= %@,valuie = %@",cookie.name,cookie.value);
            }
            NSLog(@"\n======================================\n");
    //        //获取cookie方法2
    //        NSString *cookies2 = [((NSHTTPURLResponse*)task.response) valueForKey:@"Set-Cookie"];
    //        NSLog(@"cookies2 = %@",[cookies2 description]);
    
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
        }];
    

    二.清空Cookie

    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
      NSArray *cookieArray = [NSArray arrayWithArray:[cookieJar cookies]];
      for (NSHTTPCookie *obj in cookieArray) {
        [cookieJar deleteCookie:obj];
      }
    

    三.手动设置Cookie 手动设置的Cookie不会自动持久化到沙盒

    第一次请求手动设置个cookie
    -(void)test1:(NSString*)urlString{
        NSURL *url = [NSURL URLWithString:@"http://dev.skyfox.org/cookie.php"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        
        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
        [cookieProperties setObject:@"username" forKey:NSHTTPCookieName];
        [cookieProperties setObject:@"my ios cookie" forKey:NSHTTPCookieValue];
        [cookieProperties setObject:@"dev.skyfox.org" forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:@"dev.skyfox.org" forKey:NSHTTPCookieOriginURL];
        [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
        [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
        [cookieProperties setObject:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];//设置失效时间
        [cookieProperties setObject:@"0" forKey:NSHTTPCookieDiscard]; //设置sessionOnly
    
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        [self.myWebView loadRequest:request];
    }
    //第二次请求会自动带上Cookie
    - (IBAction)test2:(id)sender {
        NSURL *url = [NSURL URLWithString:@"http://dev.skyfox.org/cookie.php"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [self.mywebview2 loadRequest:request];
    }
    

    request还可以这样设置个Cookie

    [request setHTTPShouldHandleCookies:YES];
    [request setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];
    

    四.Cookie的本地缓存策略

    //NSHTTPCookieAcceptPolicyAlways:保存所有cookie,这个是默认值
    //NSHTTPCookieAcceptPolicyNever:不保存任何响应头中的cookie
    //NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只保存域请求匹配的cookie
    
    [[NSHTTPCookieStorage sharedHTTPCookieStorage]setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
    

    PS:本文转载:http://www.skyfox.org/ios-url-request-cookie.html

    相关文章

      网友评论

          本文标题:iOS HTTP网络请求Cookie的读取与写入(NSHTTPC

          本文链接:https://www.haomeiwen.com/subject/muacyktx.html