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];
}

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

推荐阅读更多精彩内容