如有错误请指出
首先在进行网络编程时我们要对HTTP协议有一定的了解。HTTP协议,全称“超文本传输协议”,浏览器和服务器之间的通信规则,HTTP协议永远都是客户端发起请求,服务器回送响应。客户端发送一个请求,是向服务器提交一个请求包,服务器收到请求后,会向客户端回应一个响应包。HTTP的请求包由两部分组成:请求头和请求体。同理响应包也有响应头和响应体。服务器是通过响应包将数据发送给客户端,数据主要在响应包得响应体中,响应头中有相应的数据的类型以及状态码。HTTP常见的请求方式有两种,一种是GET请求,是向服务器索取数据的一种请求方式,只有请求头,另外一种是POST请求,是向服务器提交数据的一种方式请求方式,有请求头和请求体。
讲完了HTTP的相关知识,现在给大家讲一下接下来要用到的类。
1.NSURLRequest 用于储存客户端发送给服务器的数据包信息和请求设置,因为其基本设置选项较少所以我们一般使用其子类:NSMutableURLRequest。
2.NSURLResponse用于储存服务器返回的响应包数据,如果发送的是HTTP请求,那么使用其子类:NSHTTPURLResponse
3.NSURLSession指的是一个网络会话(session),一个网络会话可以发起多个任务(Task),一个任务对应了一次网络请求。
使用NSURLSession进行网络请求的流程:
1.构造NSURL
2.构造NSURLRequest请求对象
3.构造NSURLSession会话对象
4.创建网络请求任务:dataTask, downloadTask, uploadTask
5.发送网络请求
//请求网址
NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
//设置request属性
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"GET";
request.timeoutInterval = 60;
//创建session,默认是多线程
NSURLSession *session = [NSURLSession sharedSession];
//设置任务及其回调的Block
NSURLSessionDataTask *dataTsk = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"请求出错:%@",error);
return;
}
NSError *jsonError = nil;
//获取响应的数据
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];
//打印响应的数据
NSLog(@"%@",dic);
[_textView performSelectorOnMainThread:@selector(setText:) withObject:[NSString stringWithFormat:@"%@", dic] waitUntilDone:YES];
}];
//开始任务
[dataTsk resume];
NSURL *url = [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
//如果60S不响应就退出
request.timeoutInterval = 60;
//设置请求体
NSData *bodyData =[@"cinema_id=1533" dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody = bodyData;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSString *jsonString = [NSString stringWithFormat:@"%@",dic];
//转换类型
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//打印状态码
NSLog(@"状态设计:%li",httpResponse.statusCode);
//打印响应头
NSDictionary *responseHeader = httpResponse.allHeaderFields;
NSLog(@"响应头:%@",responseHeader);
}];
[dataTask resume]
下载任务:
NSURL *url = [NSURL URLWithString:@"http://dlsw.baidu.com/sw-search-sp/soft/bf/35013/Baidu_Setup_1959_2.2.0.1452_10000010.1449569847.exe"];
//设置Configs属性
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//这儿可以使用代理方法检测下载任务
session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
downloadTask = [session downloadTaskWithURL:url];
[downloadTask resume];
上传任务:
NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/upload.json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;charset = utf-8;boundary=%@", Boundary];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"upload_pic" ofType:@"jpg"];
NSData *imageData = [NSData dataWithContentsOfFile:path];
//自定义的请求体方法
NSData *boadyData = [self bulidHTTPBodyData:imageData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:boadyData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"error:%@", error);
NSLog(@"上传图片至微博成功:%@", response);
}];
[uploadTask resume];