网络传输知识总结及AFNetworking使用心得

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

    }];

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值