网络请求 cookie的添加

来源:互联网 发布:tensorflow 下载 编辑:程序博客网 时间:2024/05/16 18:12

当你访问一个网站时,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 *cookiein [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 objin 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


0 0