文档章节

【已过时,新的sdk和框架默认支持】AFNetworking 支持cookies的解决方案

法斗斗
 法斗斗
发布于 2016/05/18 16:11
字数 1275
阅读 13
收藏 0
点赞 2
评论 0

【已过时,新的sdk和框架默认支持】AFNetworking 支持cookies的解决方案

摘要 AFNetworking是支持cookies,只不过它把这个逻辑交给了iOS 底层的api处理了。 Cookies are handled entirely by the Foundation URL Loading system, upon which AFNetworking is built. You have complete control over the behavior of cookies in requests by configuring NSMutableURLRequest (setHTTPShouldHandleCookies) and NSHTTPCoo...

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

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

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

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

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

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

 // 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;

 

//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;

 

   其实现是:

- (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实现是:

- (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的使用方式:

/**
 *执行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的使用方式如下:

/**
 *执行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);
         }
         
     }];
    
    
}

 

测试运行:

2014-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>

//--使用cookies
TPTripPlusDetailViewController.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>

 

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

由于项目结构复杂,我还没来得及花时间抽出好的完整代码,但关键代码都已经在上述代码中给出,需要的同学,自己整理下,有问题,可以联系我,3q

本文转载自:

共有 人打赏支持
法斗斗
粉丝 20
博文 367
码字总数 17774
作品 0
杨浦
程序员

暂无文章

防火墙实例

3、一个包过滤防火墙实例 环境:redhat9 加载了string time等模块 eth0 接外网──ppp0 eth1 接内网──192.168.0.0/24 #!/bin/sh modprobe ipt_MASQUERADE modprobe ip_conntrack_ftp modp...

李超小牛子
3分钟前
0
0
TensorFlow 作用域与操作符的受限范围

variable_scope 影响变量和操作符 name_scope 只影响操作符 with tf.name_scope(""),使用空字符串将作用域返回到顶层 tf.variable_scope("") 相当于添加一个空层 import tensorflow as tf...

阿豪boy
13分钟前
0
0
Java面试基础篇——第六篇:常见Map类的区别

常见的map类有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。 其中我们最常用的莫过于HashMap, 和并发情况下使用的ConcurrentHashMap了,它们的主要区别就在...

developlee的潇洒人生
15分钟前
0
0
崛起于Springboot2.X之前端模版freemaker(23)

1、配置文件 spring: freemarker: allow-request-override: false cache: true check-template-location: true charset: UTF-8 content-type: text/html ......

木九天
31分钟前
1
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
33分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
38分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
40分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
43分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
50分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
53分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部