您的位置:首页 > 理论基础 > 计算机网络

网络请求 cookie的添加

2016-02-03 11:21 435 查看
当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。

同样适用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于认证的网络请求

认识下NSHTTPCookieStorage

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

Cookie

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

HTTP header

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

ios htttp网络请求cookie的读取与写入:

1.原生NSURLConnection写法

    - (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
写法

    

    [[APIClient sharedClient] postPath:@"http://api.skyfox.org/api-test.php" parameters:p success:^(AFHTTPRequestOperation *operation,
id JSON) {

        NSDictionary *fields = [operation.response allHeaderFields];
//afnetworking写法

        NSLog(@"fields = %@",[fields description]);

        NSURL *url = [NSURL URLWithString:@"http://api.skyfox.org/api-test.php"];

        //获取cookie方法1

        NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:fields forURL:url];

        //获取cookie方法2

        //NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"];

        

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        

    }];

    二.清空cookie

    

    

    1

    2

    3

    4

    5

    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];

    NSArray *cookieArray = [NSArray arrayWithArray:[cookieJar cookies]];

    for (id obj
in cookieArray) {

        [cookieJar deleteCookie:obj];

    }

    三.手动设置cookie

 

    第一次请求手动设置个cookie

    -(void)test1:(NSString*)urlString{

        NSURL *url = [NSURL URLWithString:@"http://api.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:@"api.skyfox.org" forKey:NSHTTPCookieDomain];

        [cookieProperties setObject:@"api.skyfox.org" forKey:NSHTTPCookieOriginURL];

        [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];

        [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];

        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

        [self.myWebView loadRequest:request];

    }

    //第二次请求会自动带上cookie

    - (IBAction)test2:(id)sender {

        NSURL *url = [NSURL URLWithString:@"http://api.skyfox.org/cookie.php"];

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        [self.mywebview2 loadRequest:request];

    }

AFNetworking 3.0

    request还可以这样设置个cookie

   

    [request setHTTPShouldHandleCookies:YES];

    [request setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: