iOS AFNetworking 以及参数Cookie 详解

1> GET 请求:

NSString *url = @"[http://gank.io/api/history/content/2/1](http://gank.io/api/history/content/2/1)";

AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

[manager GET:url

         parameters:nil

         progress:^(NSProgress * _Nonnull downloadProgress)

         {

         }

         success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)

         {

             NSLog(@"这里打印请求成功要做的事");

             // 获取所有数据报头信息

             NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)task.response;

             NSDictionary *fields = [HTTPResponse allHeaderFields];// 原生NSURLConnection写法

             NSLog(@"fields = %@", [fields description]);

             // 获取cookie方法1

             NSArray *cookies = [NSHTTPCookiecookiesWithResponseHeaderFields:fields forURL:[NSURLURLWithString:url]];

             for(NSHTTPCookie *cookie in cookies)

             {

                 NSLog(@"cookie1 -> %@", cookie);

             }

             // 获取cookie方法2

             NSString *cookieString = [[HTTPResponse allHeaderFields] valueForKey:@"Set-Cookie"];

             NSLog(@"cookie2 -> %@", cookieString);

             // 获取cookie方法3

             NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];

             for(NSHTTPCookie *cookie in [cookieJar cookies])

             {

                 NSLog(@"cookie3 -> %@", cookie);

             }

         }

         failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull  error)

         {

             NSLog(@"%@",error);// 这里打印错误信息

         }];

2> POST请求:

AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
NSMutableDictionary *parameters = @{@"":@"", @"":@""};
[manager POST:URL
         parameters:parameters
         progress:^(NSProgress * _Nonnull uploadProgress)
         {
         }
         success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
         {
         }
         failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
         {
         }];

3> 下载

// 1.创建管理者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
manage.requestSerializer = [AFHTTPRequestSerializerserializer];
manage.requestSerializer.stringEncoding = NSUTF8StringEncoding;
manage.requestSerializer.timeoutInterval = 10;
manage.responseSerializer = [AFHTTPResponseSerializerserializer];
manage.responseSerializer.stringEncoding = NSUTF8StringEncoding;
manage.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
// 2.确定请求的URL地址
NSURL *url = [NSURLURLWithString:@""];
// 3.创建请求对象
NSURLRequest *request = [NSURLRequestrequestWithURL:url];
// 下载任务
NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request
                                          progress:^(NSProgress * _Nonnull downloadProgress)
                                          {
                                              // 打印下下载进度
                                              NSLog(@"%lf",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
                                          }
                                          destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response)
                                          {
                                              // 下载地址
                                              NSLog(@"默认下载地址:%@",targetPath);
                                              // 设置下载路径,通过沙盒获取缓存地址,最后返回 NSURL对象
                                              NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
                                              return [NSURLURLWithString:filePath];
                                          }
                                          completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error)
                                          {
                                              // 下载完成调用的方法
                                              NSLog(@"下载完成:");
                                              NSLog(@"%@--%@",response,filePath);
                                          }];
// 开始启动任务
[task resume];

4> 上传
第一种方法是通过工程中的文件进行上传

// 1.创建管理者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
// 2.上传文件
NSDictionary *dict = @{@"":@""};
NSString *urlString = @"";
[manager POST:urlString
         parameters:dict
         constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData)
         {
             // 上传文件参数
             UIImage *iamge = [UIImageimageNamed:@"123.png"];
             NSData *data = UIImagePNGRepresentation(iamge);
             // 这个就是参数
             [formData appendPartWithFileData:data name:@"file"fileName:@"123.png"mimeType:@"image/png"];
         }
         progress:^(NSProgress * _Nonnull uploadProgress)
         {
             // 打印下上传进度
             NSLog(@"%lf", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
         }
         success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
         {
             // 请求成功
             NSLog(@"请求成功:%@",responseObject);
         }
         failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
         {
             // 请求失败
             NSLog(@"请求失败:%@",error);
         }];

第二种是通过URL来获取路径,进入沙盒或者系统相册等等

// 1.创建管理者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
// 2.上传文件
NSDictionary *dict = @{@"":@""};
NSString *urlString = @"";
[manager POST:urlString
         parameters:dict
         constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData)
         {
             [formData appendPartWithFileURL:[NSURLfileURLWithPath:@"文件地址"] name:@"file"fileName:@"1234.png"mimeType:@"application/octet-stream"error:nil];
         }
         progress:^(NSProgress * _Nonnull uploadProgress)
         {
             // 打印下上传进度
             NSLog(@"%lf",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
         }
         success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
         {
             // 请求成功
             NSLog(@"请求成功:%@", responseObject);
         }
         failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
         {
             // 请求失败
             NSLog(@"请求失败:%@", error);
        }];

5> 设置 Cookie 中的值

方法1:

AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

[manager.requestSerializersetHTTPShouldHandleCookies:YES];

[manager.requestSerializer setValue:[NSString stringWithFormat:@"%@=%@", [cookie name], [cookie value]] forHTTPHeaderField:@"Cookie"];

方法2:

NSMutableDictionary *cookieProperties = [NSMutableDictionarydictionary];

[cookieProperties setObject:@"username"forKey:NSHTTPCookieName];

[cookieProperties setObject:@"my ios cookie"forKey:NSHTTPCookieValue];

[cookieProperties setObject:@"[api.skyfox.org](http://api.skyfox.org/)"forKey:NSHTTPCookieDomain];

[cookieProperties setObject:@"[api.skyfox.org](http://api.skyfox.org/)"forKey:NSHTTPCookieOriginURL];

[cookieProperties setObject:@"/"forKey:NSHTTPCookiePath];

[cookieProperties setObject:@"0"forKey:NSHTTPCookieVersion];

[cookieProperties setObject:[NSDatedateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];//设置失效时间

[cookieProperties setObject:@"0"forKey:NSHTTPCookieDiscard]; //设置sessionOnly

NSHTTPCookie *cookie = [NSHTTPCookiecookieWithProperties:cookieProperties];

[[NSHTTPCookieStoragesharedHTTPCookieStorage] setCookie:cookie];

6> 清空Cookie

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStoragesharedHTTPCookieStorage];
NSArray *cookieArray = [NSArrayarrayWithArray:[cookieJar cookies]];
for(id obj in cookieArray)
{
    [cookieJar deleteCookie:obj];
}

7> Cookie的本地缓存策略

// NSHTTPCookieAcceptPolicyAlways: 保存所有cookie,这个是默认值
// NSHTTPCookieAcceptPolicyNever: 不保存任何响应头中的cookie
// NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain: 只保存域请求匹配的cookie
[[NSHTTPCookieStoragesharedHTTPCookieStorage]setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

8> 手动保存和加载 Cookie

// 保存Cookie
- (void)saveCookies
{
    NSData *cookiesData = [NSKeyedArchiverarchivedDataWithRootObject:[[NSHTTPCookieStoragesharedHTTPCookieStorage] cookies]];
    NSUserDefaults *defaults = [NSUserDefaultsstandardUserDefaults];
    [defaults setObject:cookiesData forKey:@"org.skyfox.cookie"];
    [defaults synchronize];
}

// 加载Cookie 一般都是app刚刚启动的时候
- (void)loadCookies
{
    NSArray *cookies = [NSKeyedUnarchiverunarchiveObjectWithData:[[NSUserDefaultsstandardUserDefaults] objectForKey:@"org.skyfox.cookie"]];
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStoragesharedHTTPCookieStorage];
    for (NSHTTPCookie *cookie in cookies)
    {
        [cookieStorage setCookie:cookie];
    }
}

9> 检查网络状态

(1)开启网络监听,一般在程序启动时调用,可以放在 AppDelegate 中
              [[AFNetworkReachabilityManagersharedManager] startMonitoring];
    (2)在需要监测网络的地方调用该方法去获取当前网络状态
        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManagersharedManager];
         //  枚举里面四个状态  分别对应未知无网络数据 WiFi
         //  typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
        //      AFNetworkReachabilityStatusUnknown          = -1,  未知
         //      AFNetworkReachabilityStatusNotReachable     = 0,   无网络
        //      AFNetworkReachabilityStatusReachableViaWWAN = 1,   蜂窝数据网络
         //      AFNetworkReachabilityStatusReachableViaWiFi = 2,   WiFi
        //  };
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
                 {
                     // 这里是监测到网络改变的block
                     switch (status)
                     {
                         caseAFNetworkReachabilityStatusUnknown:
                             NSLog(@"未知网络状态");
                         break;
                         caseAFNetworkReachabilityStatusNotReachable:
                             NSLog(@"无网络");
                         break;
                         caseAFNetworkReachabilityStatusReachableViaWWAN:
                             NSLog(@"蜂窝数据网");
                         break;
                         caseAFNetworkReachabilityStatusReachableViaWiFi:
                             NSLog(@"WiFi网络");
                         break;
                         default:
                         break;
                     }
                 }];

注:如果启动就去检测有可能得到的是 status == AFNetworkReachabilityStatusUnknown,建议延迟在调用或者 在收到监听网络状态回调以后再取

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259