欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

AFNetworking 支持cookies的解决方案

发布时间:2023/12/8 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 AFNetworking 支持cookies的解决方案 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

   AFNetworking是支持cookies,只不过它把这个逻辑交给了iOS 底层的api处理了。

   多话不说了,很讨厌网上那些人云亦云的帖子,三人成虎!

  本次我们的项目重构,需要用到cookies,我直接给出解决方案吧:

(cookie使用支持的简单思路是:首次请求时,服务器取回cookies,然后每次请求时附加上cookie,如此反复即可,至于cookies中有啥内容,我们不用关注,服务器要就给她)

  我使用的是AFNetworking的AFHTTPClient进行网络访问的,我就直接在AFHTTPClient.h添加两个支持cookies的方法,一个是为post写的,另一个是为get写的。

1、在AFHTTPClient.h添加两个支持cookies的方法,每次请求时,都发送出本地cookies

12345 // add by block cheng- (void)blockGetPath:(NSString *)path     parameters:(NSDictionary *)parameters        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

12345//add by block cheng- (void)blockPostPath:(NSString *)path      parameters:(NSDictionary *)parameters         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

   其实现是:

1234567891011121314151617181920212223242526272829303132333435363738394041- (void)blockGetPath:(NSString *)path          parameters:(NSDictionary *)parameters             success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success             failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{         if (!path) {        path = @"";    }         NSArray *arcCookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: @"sessionCookies"]];    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];         for (NSHTTPCookie *cookie in arcCookies){        [cookieStorage setCookie: cookie];    }         NSURL *dataUrl = [NSURL URLWithString:path relativeToURL:self.baseURL];    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:dataUrl];//id: NSHTTPCookie    NSDictionary *sheaders = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];         NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));         __strong NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:dataUrl cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.f];         [request setHTTPMethod:@"GET"];    [request addValue:@"iOS" forHTTPHeaderField:@"User-Agent"];    [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];//    [request setHTTPBody:[AFQueryStringFromParametersWithEncoding(parameters, NSUTF8StringEncoding) dataUsingEncoding:NSUTF8StringEncoding]];    [request setAllHTTPHeaderFields:sheaders];         if (parameters) {            dataUrl = [NSURL URLWithString:[[dataUrl absoluteString] stringByAppendingFormat:[path rangeOfString:@"?"].location == NSNotFound ? @"?%@" : @"&%@", AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding)]];            [request setURL:dataUrl];    }    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];    [self enqueueHTTPRequestOperation:operation];}

  post实现是:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758- (void)blockPostPath:(NSString *)path           parameters:(NSDictionary *)parameters              success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success              failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{    if (!path) {        path = @"";    }    NSArray *arcCookies = [NSKeyedUnarchiver unarchiveObjectWithData: [[NSUserDefaults standardUserDefaults] objectForKey: @"sessionCookies"]];    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];         for (NSHTTPCookie *cookie in arcCookies){        [cookieStorage setCookie: cookie];    }         NSURL *dataUrl = [NSURL URLWithString:path relativeToURL:self.baseURL];    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:dataUrl];//id: NSHTTPCookie    NSDictionary *sheaders = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];         NSString *charset = (NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));         __strong NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:dataUrl cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.f];         [request setHTTPMethod:@"Post"];    [request addValue:@"iOS" forHTTPHeaderField:@"User-Agent"];    [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];//    [request setHTTPBody:[AFQueryStringFromParametersWithEncoding(parameters, NSUTF8StringEncoding) dataUsingEncoding:NSUTF8StringEncoding]];    [request setAllHTTPHeaderFields:sheaders];    if (parameters) {        NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding));        NSError *error = nil;                 switch (self.parameterEncoding) {            case AFFormURLParameterEncoding:;                [request setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];                [request setHTTPBody:[AFQueryStringFromParametersWithEncoding(parameters, self.stringEncoding) dataUsingEncoding:self.stringEncoding]];                break;            case AFJSONParameterEncoding:;                [request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];                [request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]];                break;            case AFPropertyListParameterEncoding:;                [request setValue:[NSString stringWithFormat:@"application/x-plist; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];                [request setHTTPBody:[NSPropertyListSerialization dataWithPropertyList:parameters format:NSPropertyListXMLFormat_v1_0 options:0 error:&error]];                break;        }                 if (error) {            NSLog(@"%@ %@: %@", [self class], NSStringFromSelector(_cmd), error);        }         }         AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];    [self enqueueHTTPRequestOperation:operation];  }

  对应的使用方法分别是:

2、每次请求返回时,保存cookie,以供以后使用

 get的使用方式:

?
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859/** *执行get请求,支持cookie *TODO: 需要完善 **/-(void)asynchronousCookiesGET:(NSString *)path witParams:(NSMutableDictionary *)params{    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:BASE_URL_SESSION]];    self.client = httpClient;    [httpClient release];    [self.client blockGetPath:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)     {         D_END;         LogNET(@"------------------------GET--->------------------------------");         LogNET(@"netWorking url:: %@",operation.request.URL.absoluteString);         LogNET(@"netWorking params:: %@",params);         LogNET(@"net working statuCode:: %d",operation.response.statusCode);         LogNET(@"net working responseString:: %@",operation.responseString);         LogNET(@"------------------------GET---<-----------------------------");                   NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];         for (NSHTTPCookie *cookie in cookies) {             // Here I see the correct rails session cookie             NSLog(@"Block cookie: %@", cookie);         }                   NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];         NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];         [defaults setObject: cookiesData forKey: @"sessionCookies"];         [defaults synchronize];                        //handle server return data;                                   }failure:^(AFHTTPRequestOperation *operation, NSError* error)     {         LogNET(@"------------------------GET--->------------------------------");         LogNET(@"netWorking url:: %@",operation.request.URL.absoluteString);         LogNET(@"net working statuCode:: %d",operation.response.statusCode);         LogNET(@"net working responseString:: %@",operation.responseString);         LogNET(@"------------------------GET---<-----------------------------");                   WebExceptionEntity* exception = [[WebExceptionEntity alloc] initWithExceptionString:operation.responseString withStatusCode:operation.response.statusCode withError:error];         self.webException= exception;         [exception release];                   if (self.exceptionBlock)         {             self.exceptionBlock(self,self.webException);         }               }     ];          }

Post的使用方式如下:

?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354/** *执行post请求:支持cookie的版本 **/-(void)asynchronousCookiesPost:(NSString *)path              witParams:(NSMutableDictionary *)params{    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:BASE_URL_SESSION]];    self.client = httpClient;    [httpClient release];    if (self.preBlcok) {        self.preBlcok(self);    }    [self.client blockPostPath:path parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)     {         D_END;         LogNET(@"------------------------POST--->------------------------------");         LogNET(@"netWorking url:: %@",operation.request.URL.absoluteString);         LogNET(@"netWorking params:: %@",params);         LogNET(@"net working statuCode:: %d",operation.response.statusCode);         LogNET(@"net working responseString:: %@",operation.responseString);         LogNET(@"------------------------POST---<-----------------------------");                   NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];         for (NSHTTPCookie *cookie in cookies) {             // Here I see the correct rails session cookie             NSLog(@"cookie: %@", cookie);         }                   NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];         NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];         [defaults setObject: cookiesData forKey: @"sessionCookies"];         [defaults synchronize];              //handle server return data     }failure:^(AFHTTPRequestOperation *operation, NSError* error)     {         LogNET(@"------------------------POST--->------------------------------");         LogNET(@"netWorking url:: %@",operation.request.URL.absoluteString);         LogNET(@"net working statuCode:: %d",operation.response.statusCode);         LogNET(@"net working responseString:: %@",operation.responseString);         LogNET(@"------------------------POST---<-----------------------------");         WebExceptionEntity* exception = [[WebExceptionEntity alloc] initWithExceptionString:operation.responseString withStatusCode:operation.response.statusCode withError:error];         self.webException= exception;         [exception release];                   if (self.exceptionBlock)         {             self.exceptionBlock(self,self.webException);         }               }];          }

测试运行:

?
1234562014-02-14 10:00:53.465 TripPlus[15245:60b] cookie: <NSHTTPCookie version:0 name:"ssid" value:"79244stsh4p3shv1ftd1125d90" expiresDate:(null) created:2014-02-14 02:00:53 +0000 (4.14036e+08) sessionOnly:TRUE domain:"192.168.1.199" path:"/" isSecure:FALSE>//--使用cookiesTPTripPlusDetailViewController.m:141      .... 开始请求AFHTTPClient.m:706  post  add cookie:<NSHTTPCookie version:0 name:"acb5f57bfaec0550abdb337d5e8f0f40" value:"1febc174d86a8f5473af180658a7d9369b1e35daa%3A4%3A%7Bi%3A0%3Bs%3A1%3A%221%22%3Bi%3A1%3Bs%3A17%3A%22test%40joviainc.com%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D" expiresDate:2014-03-16 02:00:50 +0000 created:2001-01-01 00:00:01 +0000 (1) sessionOnly:FALSE domain:"192.168.1.199" path:"/" isSecure:FALSE>AFHTTPClient.m:706  post  add cookie:<NSHTTPCookie version:0 name:"ssid" value:"79244stsh4p3shv1ftd1125d90" expiresDate:(null) created:2001-01-01 00:00:01 +0000 (1) sessionOnly:TRUE domain:"192.168.1.199" path:"/" isSecure:FALSE>

从结果可看出,完美运行。

总结

以上是生活随笔为你收集整理的AFNetworking 支持cookies的解决方案的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。