iOS HTTP协议(网络请求)

常见的请求方式

  • GET请求
  • POST请求
  • 不同点:
  1. 给服务器传输数据的方式不同,GET是通过网址字符串,POST是通过data。
  2. 传输数据的大小,GET:网址的字符串最多255个字节,POST使用NSData,容量超过1G。
  3. 安全性:GET:所有传输给服务器的数据,显示在网址里,类似于密码的明文输入,直接可见。POST:数据被转换成为NSData(二进制数据),类似于密码的密文数据,无法直接读取。

NSURL

  • url:统一资源定位符,也被称为网址
  • url的符语法:协议//授权/路径?查询
  • 协议:ftp://(文件传输协议) http://(超文本传输协议) https://(安全超文本传输协议) file://(本地文件协议)

连接方式(主要针对NSURLConnection)

  • 同步连接:只有数据请求完成了之后才会执行后面的代码,容易出现页面的卡死。
  • 异步连接:在请求数据的同时不影响后面代码的执行。
  • 异步连接有两中实现方式( 1. 设置代理,接收数据 2.实现block)。
  • 在iOS7.0之后使用NSURLSession来代替,本片主要针对于NSURLSession做一个讲解,对于已经废弃的NSURLConnection不做讲解。

使用HTTP请求的注意事项

由于xcode不支持http请求所以我们需要通过修改info.plist文件来让xcode支持http请求,我们需要在info.plist文件中增加如下键值对

  1. 新建一个NSAppTransportSecurity字典
  2. 在字典中添加如下键值对,并把值设为YES

NSURLSession(Block)的方式

GET请求

  1. 创建一个URL对象
NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
    NSURL *url = [NSURL URLWithString:urlString];
  1. 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
  1. 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
     //block 参数的解释
        //response 响应头的信息
        //data 我们所需要的真是的数据
        //connectionError 链接服务器的错误信息
        NSLog(@"请求到数据了");
    }];

只要完成以上三步就可以实现GET的请求了

POST请求

  1. 创建一个URL对象
NSURL *url = [NSURL URLWithString:
@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
  1. 设置请求方式(注:只有NSMutableURLRequest才可以设置网络请求的方式,NSURLRequest默认是GET请求。当我们不设置请求方式的时候,默认的是GET请求)
NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];
//设置请求方式
[mutableRequest setHTTPMethod:@"POST"];
  1. 设置参数
NSString *dataString = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
[mutableRequest setHTTPBody:[dataString dataUsingEncoding:NSUTF8StringEncoding]];
  1. 创建session对象用来进行post请求
NSURLSession *session = [NSURLSession sharedSession];//使用单例来创建对象。
  1. 建立请求任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:NULL];
        NSLog(@"NSURLsessison_________ %@",dict);
    }];
  1. 启动任务(注意:一定不要忘记启动任务,否则请求是不会开始的)
[dataTask resume];

使用NSURLsession实现下载

  1. 创建一个URL对象
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
  1. 创建一个session对象
NSURLSession *session = [NSURLSession sharedSession];//使用单例创建
  1. 创建一个下载的工作任务模式
NSURLSessionDownloadTask *downLoadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"error-----------%@",error);
        }else{
            //location下载好的文件存储的路径,是在一个临时的文件中。/Users/xalo/Desktop/
            //创建一个保存下载文件的路径
            NSURL *targetUrl = [NSURL fileURLWithPath:@"/Users/xalo/Desktop/myJson.json"];
            //将临时路径下的文件拷贝到桌面文件
            NSFileManager *fileManage = [NSFileManager defaultManager];
            [fileManage copyItemAtURL:location toURL:targetUrl error:NULL];
            NSLog(@"location --------%@",location);
        }
    }];
  1. 启动下载任务(关键的一步)
[downLoadTask resume];

NSURLsession(Delegate)协议代理方式

下面只列举出GET方式的协议代理的请求方式,POST的请求方式只需要另外设置一下NSMutableURLRequest请求的方式,再设置一个参数就可以了,具体的协议代理的方法,和GET请求时使用的是一样的在使用协议的方法请求数据的时候,我们需要先遵循<NSURLSessionTaskDelegate,NSURLSessionDataDelegate>这两个协议

  1. 创建一个URL对象:注意:网址之间一定不能有空格
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
  1. 因为NSURLSession的delegate是只读的,所以我们需要通过下面的方法来签订协议
NSURLSession *session = [NSURLSession sessionWithConfiguration:
[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:
[[NSOperationQueue alloc]init]];
  1. 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
  1. 创建任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
  1. 启动任务
[dataTask resume];
  1. 实现协议方法
    声明一个NSData类型的属性用于接收请求回来的数据
@interface RootViewController ()<NSURLSessionTaskDelegate,NSURLSessionDataDelegate>
@property (strong, nonatomic)NSMutableData *data;//用于接收协议代理请求回来的数据
@end
  • 服务器开始响应,准备返回数据
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
didReceiveResponse:(NSURLResponse *)response 
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    completionHandler(NSURLSessionResponseAllow);//允许处理服务器的响应,才会继续接收返回的数据。
//初始化可变的data准备接受服务器传回的data片段
    self.data = [NSMutableData data];
}
  • 客户端开始接受数据
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 
didReceiveData:(NSData *)data{
    [self.data appendData:data];
}
  • 数据接受完成,网络请求成功(如果请求失败,那么error对象将会被赋值错误信息)
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task 
didCompleteWithError:(NSError *)error{
//因为本次后台提供的是JSON类型的数据,而且数据的结构为字典,所以采用JSON解析并且使用字典来接收结果。
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.data 
options:NSJSONReadingAllowFragments error:NULL];
}

至此,只要完成了以上六个步骤,并且实现了三个协议方法,就可以成功的通过协议代理的方式请求回来数据了。

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

推荐阅读更多精彩内容