Cookie
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器或者客户端),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站地址时就发送该Cookie给服务器在使用UIWebView访问网站时,经常遇到的一个问题是需要登录。比如访问新浪微博,或者访问某个个人账号,但是需要直接访问url,却会被重定向到登录页进行登录。那么真正的浏览器是如何做到的直接登录?一般来说,答案都是cookies。在你第一次登录时,网站设置了cookie,浏览器保存这些携带了登录信息的cookies,以后就可以直接登录。所以我们要做的就是在url request中带上cookies。
HTTP header
HTTP header中包含HTTP请求与响应的操作参数. header属性定义了所传输数据的各种特性. header属性以属性名开始,以冒号结尾,最后是属性值.属性名及值会因应用的不同
手动设置cookie值
NSMutableURLRequest设置Cookie值,一般必须包含以下几项:NSHTTPCookieValue, NSHTTPCookieName, NSHTTPCookiePath, NSHTTPCookieDomain。NSMutableURLRequest中提供了- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field 方法。同样的方法,还可以设置很多http header中的field。
NSMutableURLRequest连接中设置其他参数(采用JSON方式)
发送连接请求
苹果自动存储cookie机制: NSHTTPCookieStorage
因为NSHTTPCookieStorage的默认策略是: NSHTTPCookieAcceptPolicyAlways。当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,
当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。
同样适用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于认证的网络请求
NSHTTPCookieStorage 实现了一个管理cookie的单例对象(只有一个实例),每个cookie都是NSHTTPCookie类的实例,最为一个规则,cookie在所有应用之间共享并在不同进程之间保持同步。
Session cookie(一个isSessionOnly方法返回YES的cookie)只能在单一进程中使用。
一次网络请求后,可获取对应返回的cookies
可将cookie存在NSHTTPCookieStorage中,那么下次请求会自动带上相应cookies。
清空cookies
cookie 归档化存储
通过以下方法保存cookie,即可实现在退出程序,下一次进入的时候不用登录而再次使用cookie
//将cookie存储到:NSUserDefaults
//将NSUserDefaults 中的cookie信息 存储到NSHTTPCookieStorage
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器或者客户端),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站地址时就发送该Cookie给服务器在使用UIWebView访问网站时,经常遇到的一个问题是需要登录。比如访问新浪微博,或者访问某个个人账号,但是需要直接访问url,却会被重定向到登录页进行登录。那么真正的浏览器是如何做到的直接登录?一般来说,答案都是cookies。在你第一次登录时,网站设置了cookie,浏览器保存这些携带了登录信息的cookies,以后就可以直接登录。所以我们要做的就是在url request中带上cookies。
HTTP header
HTTP header中包含HTTP请求与响应的操作参数. header属性定义了所传输数据的各种特性. header属性以属性名开始,以冒号结尾,最后是属性值.属性名及值会因应用的不同
手动设置cookie值
NSMutableURLRequest设置Cookie值,一般必须包含以下几项:NSHTTPCookieValue, NSHTTPCookieName, NSHTTPCookiePath, NSHTTPCookieDomain。NSMutableURLRequest中提供了- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field 方法。同样的方法,还可以设置很多http header中的field。
NSDictionary *dictCookieUId = [NSDictionary dictionaryWithObjectsAndKeys:@"userId", NSHTTPCookieName,userId, NSHTTPCookieValue,
@"/", NSHTTPCookiePath,
@"test.com", NSHTTPCookieDomain,nil];//生成cookie的方法是先将cookie的各个property作为键值对生成dictionary
NSHTTPCookie *cookieUserId = [NSHTTPCookie cookieWithProperties:dictCookieUId];//调用cookieWIthProperties生成cookie
NSDictionary *dictCookiePToken = [NSDictionary dictionaryWithObjectsAndKeys:@"token", NSHTTPCookieName,
token, NSHTTPCookieValue,
@"/", NSHTTPCookiePath,
@"test.com", NSHTTPCookieDomain,nil];
NSHTTPCookie *cookiePassToken = [NSHTTPCookie cookieWithProperties:dictCookiePToken];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURLURLWithString:strUrl]];
NSArray *arrCookies = [NSArray arrayWithObjects: cookieUserId, cookiePassToken, nil];
NSDictionary *dictCookies = [NSHTTPCookie requestHeaderFieldsWithCookies:arrCookies];//将cookie设置到头中
[request setValue: [dictCookies objectForKey:@"Cookie"] forHTTPHeaderField: @"Cookie"];
NSMutableURLRequest连接中设置其他参数(采用JSON方式)
[request setHTTPMethod:@"POST"];
NSMutableArray *arrayData = [[NSMutableArray alloc] init];
NSMutableDictionary *dlist = [[NSMutableDictionary alloc] init];
[dlist setObject:@"trea" forKey:@"tableName"];
[dlist setObject:@"2016-04-05 11:20:00" forKey:@"latestDate"];
[arrayData addObject:dlist];
NSString *httpBodyString = [arrayData JSONRepresentation];
NSData *postData = [httpBodyString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setHTTPBody:postData];
return request;
发送连接请求
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if (responseData) {
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSMutableDictionary *dgetData = [responseString JSONValue];//json解析
}
苹果自动存储cookie机制: NSHTTPCookieStorage
因为NSHTTPCookieStorage的默认策略是: NSHTTPCookieAcceptPolicyAlways。当你访问一个网站时,NSURLRequest都会帮你主动记录下来你访问的站点设置的cookie,如果 Cookie 存在的话,会把这些信息放在 NSHTTPCookieStorage 容器中共享,
当你下次再访问这个站点时,NSURLRequest会拿着上次保存下来了的cookie继续去请求。
同样适用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于认证的网络请求
NSHTTPCookieStorage 实现了一个管理cookie的单例对象(只有一个实例),每个cookie都是NSHTTPCookie类的实例,最为一个规则,cookie在所有应用之间共享并在不同进程之间保持同步。
Session cookie(一个isSessionOnly方法返回YES的cookie)只能在单一进程中使用。
一次网络请求后,可获取对应返回的cookies
//获取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);
}
可将cookie存在NSHTTPCookieStorage中,那么下次请求会自动带上相应cookies。
NSHTTPCookie *cookiePassToken = ...;
[[NSHTTPCookieStorage sharedHTTPCookieStorage]setCookie:cookiePassToken];//上面NSHTTPCookie
清空cookies
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookieArray = [NSArray arrayWithArray:[cookieJar cookies]];
for (id obj in cookieArray) {
[cookieJar deleteCookie:obj];
}
cookie 归档化存储
通过以下方法保存cookie,即可实现在退出程序,下一次进入的时候不用登录而再次使用cookie
//将cookie存储到:NSUserDefaults
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:kServerAddress]];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:cookies];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:kUserDefaultsCookie];
//将NSUserDefaults 中的cookie信息 存储到NSHTTPCookieStorage
NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:kUserDefaultsCookie];
if([cookiesdata length]) {
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata];
NSHTTPCookie *cookie;
for (cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
}