iOS 原生网络请求 NSURLSession 和 NSMutableURLRequest应用示例

大部分的iOS开发在刚开始接触网络请求时,应该都是用的AFNetworking这个在iOS界扛把子的框架来做的吧,但你们知道这个框架在做网络请求的时候都做了什么吗。这篇文章会从系统原生的网络请求来揭示网络请求的本质,以后如果有时间会简单解析AFNetworking的源码。

原生网络请求分为三个部分:

  1. NSMutableURLRequest请求类

先来一张网络请求的抓包信息图:

网络请求抓包.png

图片来自:编程小翁

上图便是一个完整的网络请求的抓包示意图,NSMutableURLRequest这个类就是管理者上半部分的所有信息,如下图框出来的部分:

网络请求抓包.png

图片来自:编程小翁

其实就是网络请求中的HTTPHeaderField信息。我们来一一细说其中作用(其中着重看Content-Type、Cookie、Content-Length,因为我们配置这些就行了。另外还有一个重要字段图中没有,那就是传输的内容HTTPBody代码中会讲到)。

POST:这个可以是GET或者别的请求方式,这里放的是URL后半段
Host:这里是主机地址,Host和POST字段拼接起来就是一个完整的URL
Accept:这个网络请求发送的数据的格式说明:如Accept:text/html,这说明这个网络请求发送的
       是HTML格式的数据。图中的Accept:*/* 为通用格式。
Content-Type:这个字段表明数据发送方(也就是我们客户端)想要接收的数据格式,一下有一个格式
       对照表的截图。
Connection:网络请求连接的方式,这个我们不用设置。
Cookie:我们只能从服务器得到这个字段,用于维持服务端会话状态,也可以用来做接口验证,类似
        token这样的。并且在iOS中,如果请求中cookie字段有值,苹果会自动帮我们保存下来,
        代码中会讲。
Accept-Language:表明可以接收什么文字,zh-cn表示中文。
Content-Length:表示传输内容的长度。
Accept-Encoding:表示客户端支持的编码格式,这个不用我们配置。
User-Agent:这个就像是一个网名,随便写都可以,一般不做配置。

创建一个NSMutableURLRequest

/** 创建request对象 */
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
    
    /** 这个操作就是检测cookie的方法,我们的系统会自动将cookie保存下来,通过下面的方法可以检测出来,如果服务器要求我们同步cookie,则在request中设置Cookie的值 */
    NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (NSHTTPCookie *cookie in [cookieJar cookies]) {
        
        if (cookie != nil) {
            NSDictionary *headers=[NSHTTPCookie requestHeaderFieldsWithCookies:[cookieJar cookies]];
            [request setValue:[headers objectForKey:@"Cookie"] forHTTPHeaderField:@"Cookie"];
        }
    }
    
    
    /**
         如果传入参数不为空,则为POST请求
         如果传入的参数为nil,则为GET请求
     */
    if (parameters != nil && parameters.count > 0) {
        
        /** 传入的参数为一个字典,我们需要把字典转化为一个以"&"分隔的字符串,再将字符串转化为data,最后设置到HTTPBody里面去 */
        NSData *bodyData = [self getDataFromParameters:parameters];
        
        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:bodyData];
        [request setValue:[NSString stringWithFormat:@"%lld",(long long)bodyData.length] forHTTPHeaderField:@"Content-Length"];
        
        /** 这个可以固定 */
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    }
    
    /** 设置请求时间 */
    request.timeoutInterval = 8.0;
  1. NSURLSession会话类
  2. NSURLSessionDataTask会话任务类
   把这两个放到一起讲,是因为这两个很简单。一个request请求需要一个会话来启动和管理,但我们仅仅只需要一个创建一个对象就行了
    /** 创建会话对象 */
    NSURLSession *session = [NSURLSession sharedSession];

    最后我们需要把会话对象用来创建一个任务对象就完成了:
    /** 创建会话任务,并用会话对象启动请求对象 */
    NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    }];

    注意一点:会话任务需要手动启动
    /** 开始任务 */
    [sessionDataTask resume];

至此,系统原生的网络请求就完成了。
demo地址

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

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,619评论 2 7
  • 阅读目录 一、整体介绍 二、使用的一般步骤 三 举例 四 NSURLSessionConfiguration 附录...
    九洲仙人阅读 808评论 1 3
  • 一、关于老师或书籍 1、必须知道的常识:法律硕士非法学共考三大门科目,专业课、英语一、政治。专业课又分为民法(75...
    潘慧_06b3阅读 295评论 0 1
  • 三月上里。 微凉有风。 桃蕊含蕾。 几点浅思化春风,寄予桃花笺? 是三月的春风揭开了上里的春帷,是上里的茶马古道传...
    余尚义阅读 714评论 1 4
  • (六)“美丽”的服装 “天哪!”我一边欣赏着珍奇精心设计的的服装,一边赞美着那闪闪发光的用料和精细的做工。珍...
    友谊精灵阅读 328评论 0 5