HTTP协议 即超文本传输协议 是浏览器和服务器之间的通信规则
它永远是客户端发起请求,服务端发送回应
客户端发送一个HTTP请求,是向服务器提交了⼀个HTTP请求包
服务器收到请求之后,向客户端回应⼀个HTTP响应包
HTTP协议 — 请求⽅方式 HTTP请求⽅方式:客户端向服务器发送请求包时,可以分为多种不同的
请求⽅方式,常⻅见的请求⽅方式:GET请求和POST请求 GET请求:是向服务器索取数据的⼀一种请求⽅方式
例如:获取⼀一个电影列表的数据
POST请求:是向服务器提交数据的⼀一种请求⽅方式
例如:注册⽤用户、⽤用户登录
为了不阻塞主线程,应采用异步请求
iOS7之后,苹果推出了 NSURLConnection 的继任者: NSURLSession
NSURLSession⺴⽹网络组件的使⽤用流程
构造NSURL实例(链接地址)
构造NSURLRequest请求
构造NSURLSessionConfiguration (可选)
构造NSURLSession 发送请求
网络请求的一些事先方法:
- (void)getRequest
{
//创建一个URL 微博的URL 作用是获取当前用户及其关注的人的微博信息
NSURL *url = [NSURL URLWithString:@"http://apis.baidu.com/showapi_open_bus/showapi_joke/joke_text?page=1"];
//添加一个请求
NSMutableURLRequest *requset = [NSMutableURLRequest requestWithURL:url];
//设置请求体
// requset setHTTPBody:<#(NSData *)#>
//设置请求方式
[requset setHTTPMethod:@"GET"];
//设置超时时间
[requset setTimeoutInterval:20];
//添加一些信息在这个HTTPHeader(请求头)添加信息
// [requset setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>]
// [requset addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>]
[requset addValue: @"566c48ce7377f2fa5a06b7b5dfd0a1ee" forHTTPHeaderField: @"apikey"];
//所有的请求头信息
NSDictionary *dic = [requset allHTTPHeaderFields];
NSLog(@"%@",dic);
//创建一个网络会话
NSURLSession *session = [NSURLSession sharedSession];
//创建会话任务
NSURLSessionDataTask *task = [session dataTaskWithRequest:requset completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//会话任务完成之后调用的BLOCK
//拿到获取的响应体 进行json解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"响应体信息 = %@",dic);
//获取响应头信息
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSLog(@"所有的响应头信息 = %@",httpResponse.allHeaderFields);
NSLog(@"状态信息 = %ld",httpResponse.statusCode);
NSString *str = [dic valueForKey:@"text"];
NSLog(@"%@",str);
}];
//采取异步访问网络的方式
[task resume];
}
- (void)postRequest
{
NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/upload.json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:20];
NSURL *imgUrl = [NSURL URLWithString:@"http://p4.so.qhimg.com/t0102672bd8a6bd290e.jpg"];
NSData *data = [NSData dataWithContentsOfURL:imgUrl];
NSString *bodyStr = @"access_token=2.00yFweCG9vmYiC0c3374ec070_17UU&status=这个老师长得真帅";
//进行一个转码 转换成nsdata类型 后面跟着的是转码的编码模式
NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:bodyData];
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if (dic != nil) {
NSLog(@"发送成功 。。。。 %@",dic);
}
}];
[task resume];
}
@end
近期在一个上传图片的功能实现中使用了AFNetworking框架,下面做一些总结:
AFNetworking是对NSURLConnection⺴⽹网络组件进⾏行了封装
1.导入框架
2.添加类库 Security.framework、MobileCoreServices.framework、SystemConfiguration.framework
3 在使用的地方 #import "AFNetworking.h"
注意:AFNetWorking使用了ARC ,在不使用ARC项目中使用时,对AFNetWorking的所有.m文件添加“-fobjc-arc”
在使用ARC项目中,使用“不使用ARC”的类库时,对类库的.m文件添加“-fno-objc-arc”
示例代码:
- (void)getMethod
{
//创建一个manager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// NSString *parama = @"access_token=2.00yFweCG9vmYiC0c3374ec070_17UU";
//默认的解析方式 采取json的解析
// manager.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:NSJSONReadingMutableContainers];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//响应的的默认解析方式是采用json 如果需要修改 更改响应类型
//json XML http image
manager.responseSerializer = [AFImageResponseSerializer serializer];
// AFImageResponseSerializer 这个接收的直接就是一个image类型的数据 所以不需要解析直接就能在屏幕上显示
// AFHTTPResponseSerializer 这个接收的是一个data类型的数据,需要经过解析才能在屏幕上显示
NSDictionary *parama = @{
@"access_token" : @"2.00yFweCG9vmYiC0c3374ec070_17UU"
};
NSURLSessionDataTask *task = [manager GET:@"http://pic13.nipic.com/20110419/3556745_092302332151_2.jpg" parameters:nil success:^void(NSURLSessionDataTask * task, id data) {
NSLog(@"成功");
//请求体里面的内容 数据的获取
NSLog(@"data = %@",data);
_data = data;
imgView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
imgView.image = data;
dispatch_async(dispatch_get_main_queue(), ^{
[self.view addSubview:imgView];
});
} failure:^void(NSURLSessionDataTask * task, NSError * error) {
NSLog(@"失败 %@",error);
}];
[task resume];
}
- (void)postMethod
{
//创建一个manager对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// NSString *parama = @"access_token=2.00yFweCG9vmYiC0c3374ec070_17UU";
NSDictionary *parama = @{
@"access_token" : @"2.00yFweCG9vmYiC0c3374ec070_17UU",
@"status" : @"我还是辣么的帅"
};
NSURLSessionDataTask *task = [manager POST:@"https://api.weibo.com/2/statuses/update.json" parameters:parama success:^void(NSURLSessionDataTask * task, id data) {
NSLog(@"成功");
//请求体里面的内容 数据的获取
NSLog(@"data = %@",data);
} failure:^void(NSURLSessionDataTask * task, NSError * error) {
NSLog(@"失败 %@",error);
}];
[task resume];
}
- (void)downloadMethod
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://cm.sh.dl2.baidupcs.com/file/c9ffe04ca8c9203c784e0c6cb6061ae7?bkt=p2-nb-692&fid=3071777249-250528-267301444717859&time=1441175421&sign=FDTAXERLBH-DCb740ccc5511e5e8fedcff06b081203-wBAuzjBJosucj4HNO8F7HbTUOXk%3D&to=scn&fm=Nin,B,M,mn&sta_dx=42&sta_cs=0&sta_ft=mp4&sta_ct=3&fm2=Ningbo,B,M,mn&newver=1&newfm=1&secfm=1&flow_ver=3&sl=79757391&expires=8h&rt=pr&r=281952699&mlogid=670008229&vuk=3071777249&vbdid=2443159503&fin=03%20UIDatePicker.mp4&fn=03%20UIDatePicker.mp4&slt=pm&uta=0&rtype=1&iv=0&isw=0"]];
NSProgress *progress = [[NSProgress alloc]init];
AFHTTPSessionManager *manager1 = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDownloadTask *task = [manager1 downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL * url, NSURLResponse * response) {
NSLog(@"%@",url);
NSLog(@"%@",response);
return [NSURL URLWithString:@"/Users/wen/Desktop"];
}completionHandler:^void(NSURLResponse *response, NSURL * url , NSError * error) {
NSLog(@"完成");
NSLog(@"完成过后的url%@ ERROR = %@",url,error);
}];
[task resume];
//根据方法的参数去猜想要设置什么东西 比如说下面这个 要设置request progress
_progress = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault];
[_progress setProgressWithDownloadProgressOfTask:task animated:YES];
// kvo 观察者模式
_progress.center = self.view.center;
[self.view addSubview:_progress];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSInteger integer = [[change objectForKey:@"new"] integerValue];
dispatch_async(dispatch_get_main_queue(), ^{
_progress.progress = integer;
});
}
#pragma mark - 检测网络状态
-(void)moniting
{
//1.取得⺴⽹网络监控管理对象
AFNetworkReachabilityManager *reachabaManager = [AFNetworkReachabilityManager sharedManager];
//2.开始监听⺴⽹网络状态
[reachabaManager startMonitoring];
//3.设置⺴⽹网络状态变化时回调的block
[reachabaManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable:{
NSLog(@"⺴⽹网络不通");
break; }
case AFNetworkReachabilityStatusReachableViaWiFi:{ NSLog(@"⺴⽹网络通过WIFI连接");
break;
}
case AFNetworkReachabilityStatusReachableViaWWAN:{
NSLog(@"⺴⽹网络通过流量连接");
break; }}
}];
}