今天做项目接口需要用到http通信传输将数据传存储到cookie进行通信,在网上找了一些方法,都是关于如何操作cookie的,明确指出如何将cookie配置到http请求体内的blog不多,现在说明如下:
在进行一个网络通信之后设备就会产生Cookie数据:
1:Cookie的获取
如果获取的Cookie为空,那么发起一个网络请求即可产生Cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
NSLog(@"%@", cookie);
}
2:Cookie的清除
获取所有Cookie然后删除;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *_tmpArray = [NSArray arrayWithArray:[cookieJar cookies]];
for (id obj in _tmpArray) {
[cookieJar deleteCookie:obj];
}
3:Cookie的设置
设置指定的Cookie,这样做只会设置Cookie到系统,在进行网络请求的时候并不会带着Cookie到服务端,这是很多blog未提及的;
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"username" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"password" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"io" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
上面说了Cookie的一些操作,现在对如何在请求中带着cookie通信
1:苹果自带网络请求库携带cookie通信
//Cookie的基本设置
NSDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setValue:cookieValue forKey:NSHTTPCookieValue];
[properties setValue:cookieKey forKey:NSHTTPCookieName];
[properties setValue:@"" forKey:NSHTTPCookieDomain];
[properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
[properties setValue:@"/" forKey:NSHTTPCookiePath];
NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:properties];
NSArray *cookies=[NSArray arrayWithObjects:cookie,nil];
NSDictionary *headers=[NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
//将cookie塞进Request请求
NSURL *url = [NSURL URLWithString:pathStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = self.timeoutInterval;
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[headers objectForKey:@"Cookie"] forHTTPHeaderField:@"Cookie"];
这样就可以把cookie带到服务端进行通信了;
2:AFN携带cookie通信
同样,关于AFN如何携带cookie进行通信,网上的一些资料说的不是很明确,现说明如下:
NSString *cookieValue = @"AQIC5wM2LY4SfcxpzbIz4Pm51J82O5VFMd50x_es65I1DNU.*AAJTSQACMDEAAlNLABM1NjQ2MDM4ODMzNDI0NDkxOTcy*,JSESSIONID=50B3DDCD8ADDA7ACB3E5C36EFD0BB62F";
NSString *cookieKey = @"iPlanetDirectoryPro";
//Cookie的基本设置
NSDictionary *properties = [[NSMutableDictionary alloc] init];
[properties setValue:cookieValue forKey:NSHTTPCookieValue];
[properties setValue:cookieKey forKey:NSHTTPCookieName];
[properties setValue:@"" forKey:NSHTTPCookieDomain];
[properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
[properties setValue:@"/" forKey:NSHTTPCookiePath];
NSHTTPCookie *cookie = [[NSHTTPCookie alloc] initWithProperties:properties];
NSArray *cookies=[NSArray arrayWithObjects:cookie,nil];
NSDictionary *headers=[NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:tokenIdValue forKey:tokenIdKey];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//将Cookie绑定request请求
[manager.requestSerializer setValue:[headers objectForKey:@"Cookie"] forHTTPHeaderField:@"Cookie"];
[manager GET:urlString parameters:dic success:^(AFHTTPRequestOperation *operation, id responseObject) {
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];
上述2种方式亲测可行;