os htttp网络请求cookie的读取与写入(NSHTTPCookieStorage)

来源:互联网 发布:水泵扬程计算软件 编辑:程序博客网 时间:2024/05/21 11:14


转自:http://blog.sina.com.cn/s/blog_a5243c7f0102vryd.html


当你访问一个网站时,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写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.获取cookie
- (IBAction)cookieTouched:(id)sender{
    NSURL*url = [NSURLURLWithString:@"http://api.skyfox.org/api-test.php"];
    NSURLRequest*request = [NSURLRequestrequestWithURL:url]
                                            cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                        timeoutInterval:3];
    NSOperationQueue*queue = [[NSOperationQueuealloc]init];
    [NSURLConnectionsendAsynchronousRequest:request
                                      queue:queue
                          completionHandler:^(NSURLResponse*response,NSData *data,NSError *error){
                              
                              //转换NSURLResponse成为HTTPResponse
                              NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse*)response;
                              //获取headerfields
                              NSDictionary *fields = [HTTPResponseallHeaderFields];//原生NSURLConnection写法
                              // NSDictionary *fields = [operation.response allHeaderFields];//afnetworking写法
                              NSLog(@"fields= %@",[fieldsdescription]);
 
                              //获取cookie方法1
                              // NSArray *cookies = [NSHTTPCookiecookiesWithResponseHeaderFields:fields forURL:url];
   //获取cookie方法2
                              //NSString *cookieString = [[HTTPResponse allHeaderFields]valueForKey:@"Set-Cookie"];
                              //获取cookie方法3
                              NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];
                              for (NSHTTPCookie*cookie in [cookieJarcookies]){
                                  NSLog(@"cookie%@",cookie);
                              }
                          }];
    
}

2.AFNetworking 写法

1
2
3
4
5
6
7
8
9
10
11
12
[[APIClientsharedClient]postPath:@"http://api.skyfox.org/api-test.php"parameters:psuccess:^(AFHTTPRequestOperation*operation,idJSON){
        NSDictionary*fields= [operation.responseallHeaderFields];//afnetworking写法
        NSLog(@"fields= %@",[fieldsdescription]);
        NSURL*url= [NSURLURLWithString:@"http://api.skyfox.org/api-test.php"];
        //获取cookie方法1
        NSArray*cookies = [NSHTTPCookiecookiesWithResponseHeaderFields:fieldsforURL:url];
        //获取cookie方法2
        //NSString*cookieString = [[HTTPResponse allHeaderFields]valueForKey:@"Set-Cookie"];
 
    }failure:^(AFHTTPRequestOperation*operation,NSError*error){
      
    }];

二.清空cookie

1
2
3
4
5
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];
  NSArray*cookieArray = [NSArrayarrayWithArray:[cookieJarcookies]];
  for(idobj in cookieArray){
    [cookieJardeleteCookie:obj];
  }

三.手动设置cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
第一次请求手动设置个cookie
-(void)test1:(NSString*)urlString{
    NSURL*url= [NSURLURLWithString:@"http://api.skyfox.org/cookie.php"];
    NSMutableURLRequest*request= [NSMutableURLRequestrequestWithURL:url];
    
    NSMutableDictionary*cookieProperties= [NSMutableDictionarydictionary];
    [cookiePropertiessetObject:@"username"forKey:NSHTTPCookieName];
    [cookiePropertiessetObject:@"myios cookie" forKey:NSHTTPCookieValue];
    [cookiePropertiessetObject:@"api.skyfox.org"forKey:NSHTTPCookieDomain];
    [cookiePropertiessetObject:@"api.skyfox.org"forKey:NSHTTPCookieOriginURL];
    [cookiePropertiessetObject:@"/"forKey:NSHTTPCookiePath];
    [cookiePropertiessetObject:@"0"forKey:NSHTTPCookieVersion];
    NSHTTPCookie*cookie= [NSHTTPCookiecookieWithProperties:cookieProperties];
    [[NSHTTPCookieStoragesharedHTTPCookieStorage]setCookie:cookie];
    [self.myWebViewloadRequest:request];
}
//第二次请求会自动带上cookie
-(IBAction)test2:(id)sender{
    NSURL*url= [NSURLURLWithString:@"http://api.skyfox.org/cookie.php"];
    NSMutableURLRequest*request= [NSMutableURLRequestrequestWithURL:url];
    [self.mywebview2loadRequest:request];
}

request还可以这样设置个cookie

1
2
[requestsetHTTPShouldHandleCookies:YES];
[requestsetValue:[NSStringstringWithFormat:@"%@=%@",[cookiename],[cookievalue]]forHTTPHeaderField:@"Cookie"];
0 0
原创粉丝点击