iOS HTTP协议(网络请求)
2016-05-03 本文已影响3181人
Joker_King
常见的请求方式
- GET请求
- POST请求
- 不同点:
- 给服务器传输数据的方式不同,GET是通过网址字符串,POST是通过data。
- 传输数据的大小,GET:网址的字符串最多255个字节,POST使用NSData,容量超过1G。
- 安全性: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文件中增加如下键值对
- 新建一个NSAppTransportSecurity字典
- 在字典中添加如下键值对,并把值设为YES
NSURLSession(Block)的方式
GET请求
- 创建一个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];
- 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
- 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//block 参数的解释
//response 响应头的信息
//data 我们所需要的真是的数据
//connectionError 链接服务器的错误信息
NSLog(@"请求到数据了");
}];
只要完成以上三步就可以实现GET的请求了
POST请求
- 创建一个URL对象
NSURL *url = [NSURL URLWithString:
@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
- 设置请求方式(注:只有NSMutableURLRequest才可以设置网络请求的方式,NSURLRequest默认是GET请求。当我们不设置请求方式的时候,默认的是GET请求)
NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];
//设置请求方式
[mutableRequest setHTTPMethod:@"POST"];
- 设置参数
NSString *dataString = @"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
[mutableRequest setHTTPBody:[dataString dataUsingEncoding:NSUTF8StringEncoding]];
- 创建session对象用来进行post请求
NSURLSession *session = [NSURLSession sharedSession];//使用单例来创建对象。
- 建立请求任务
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);
}];
- 启动任务(注意:一定不要忘记启动任务,否则请求是不会开始的)
[dataTask resume];
使用NSURLsession实现下载
- 创建一个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"];
- 创建一个session对象
NSURLSession *session = [NSURLSession sharedSession];//使用单例创建
- 创建一个下载的工作任务模式
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);
}
}];
- 启动下载任务(关键的一步)
[downLoadTask resume];
NSURLsession(Delegate)协议代理方式
下面只列举出GET方式的协议代理的请求方式,POST的请求方式只需要另外设置一下NSMutableURLRequest请求的方式,再设置一个参数就可以了,具体的协议代理的方法,和GET请求时使用的是一样的在使用协议的方法请求数据的时候,我们需要先遵循<NSURLSessionTaskDelegate,NSURLSessionDataDelegate>这两个协议
- 创建一个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"];
- 因为NSURLSession的delegate是只读的,所以我们需要通过下面的方法来签订协议
NSURLSession *session = [NSURLSession sessionWithConfiguration:
[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:
[[NSOperationQueue alloc]init]];
- 创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
- 创建任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
- 启动任务
[dataTask resume];
- 实现协议方法
声明一个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];
}
至此,只要完成了以上六个步骤,并且实现了三个协议方法,就可以成功的通过协议代理的方式请求回来数据了。