网络编程
网络编程
1.系统架构
C/S客户端与服务器 ,B/S浏览器与服务器
服务器端的开发语言:java,.net,c/c++,php(小中型),python,ruby
服务器:分内网和外网服务器.内网比较快一点,一般用于测试
2.HTTP协议:客户端去请求,服务器端响应(短链接,请求完就关闭)
请求方式:POST请求(相对来说安全一点){提交,如用户登录等},GET请求{索取数据}.
HTTP请求 GET请求没有请求体
1.先发送一个请求数据包(里面有一个URL:资源定位符),(请求数据包分为①.请求头--一般都为键值对,②.请求体(不是必须的)---放大量的数据)
GET请求可以在URL后面拼接例如:www.baidu.com?userName= www&password=sss
拼接数据:?后面接参数count=5&..... &拼接多个参数
HTTP响应
2.响应数据包,分为响应头,响应体放在具体内容里面
GET请求放在URL后面
POST请求放在请求体里面
请求头放的一些信息,一般?后面是请求参数
3.iOS里面的请求
1.同步请求
数据的请求过程是在主线程执行的,网络数据阐述的过程会岛主主线程堵塞
2.异步请求
数据的请求过程在多线程执行,保存主线程的流畅性
UI界面的渲染与刷新在主线中执行,主线程不流畅会导致UI界面卡顿
网络请求的过程
1.构造NSURL实例(链接地址)
2.构造NSURLRequest请求
(可选)构造NSURLSessionConfiguration
3.构造NSURLSession发送请求
连接网络是要在plist文件中添加App Transport Security setting +Allow Arbitrary Loads
//1.构造URL对象
NSURL *url=[NSURL URLWithString:@"http://api.douban.com/v2/movie/top250"];
//2.构造URLRequest(不可变的对象 ),创建完成后,默认为GET请求,无法设置请求体,请求头
NSURLRequest *request=[NSURLRequest requestWithURL:url];
/*
创建可变的URL请求对象,可以设置请求头,请求体,设置请求方式NSMutableURLRequest;
NSMutableURLRequest *request2=[NSMutableURLRequest requestWithURL:url];
//设置超时时间(请求超时)
request.timeoutInterval=30;
设置请求方式
request2.HTTPMethod=@"GET";
设置请求头
[request2 setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
*/
//3.构造NSURLSession 发送网络请求
NSURLSession *session=[NSURLSession sharedSession];
//4.发起网络请求(相当于创建网络任务)
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//此block是当数据加载完成之后调用的,并且是由多线程调用的,
//data是服务器返回的响应体里面的数据
NSLog(@"%@",[NSThread currentThread]);
//解析json数据
NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}];
//5.发起网络请求
[task resume];
POST请求
//先构造URL
//1.构造URL
NSURL *url=[NSURL URLWithString:@"https://api.weibo.com/2/statuses/update.json"];
//2.构造请求对象
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
//设置请求方式
request.HTTPMethod=@"POST";
NSString *str=@"access_token=2.00XZpRbF0ycGWC7005e48da8wutC3B&status=呵呵";
NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
//设置请求体
request.HTTPBody=data;
//创建网络会话对象
NSURLSession *session=[NSURLSession sharedSession];
//创建网络任务
NSURLSessionDataTask *task=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
/*
NSURLResponse:存放相应头信息
data:响应体信息
*/
NSHTTPURLResponse *httpRes=(NSHTTPURLResponse *)response;
//获取到相应头
NSLog(@"%@",httpRes.allHeaderFields);
if (error) {
NSLog(@"发送失败");
}else {
NSLog(@"发送成功");
}
}];
//发起网络请求
[task resume];
网络任务(task)
一个Session可以发起的多个网络请求任务(Task) Session是在iOS7以后使用
1.数据任务:数据任务擅长处理且频繁的应用程序与服务器之间的请求,例如:请求json数据因为数据任务不会将数据存储到磁盘文件中,所以不支持后台Session
2.下载任务:以文件的形式接受数据,可以在程序没有运行时后台下载
3.上传任务:以文件的形式发送数据,可以在程序没有运行时就行后台上传
将临时文件转存在其他位置
//1.创建保存地址
NSString *filePath=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/song.mp3"];
//2.创建文件管理
NSFileManager *manager=[NSFileManager defaultManager];
//3.转存路径,将临时文件转存在创建的文件地址下
[manager moveItemAtURL:location toURL:[NSURL fileURLWithPath:filePath] error:nil];