网络请求

来源:互联网 发布:文化产业最新数据 编辑:程序博客网 时间:2024/06/06 09:11

//

//  ViewController.m

 

 

#define ImageUrl @"http://baike.soso.com/p/20090711/20090711101754-314944703.jpg"

 

//#define ImageUrl @"http://f.hiphotos.baidu.com/image/h%3D360/sign=9eae7c3766d9f2d33f1122e999ed8a53/3bf33a87e950352a230666de5743fbf2b3118b85.jpg"

 

#define POST @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?"

 

#define PostBody @"date=20151129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"

 

#import "ViewController.h"

 

 

 

@interface ViewController ()<NSURLSessionDelegate,NSURLSessionTaskDelegate>

 

@property (strong, nonatomic) IBOutlet UIImageView *imageV;

@property (strong,nonatomic)NSData *data;

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

}

 

    // 1、创建会话配置对象(如果会话采用全局会话即  [NSURLSession sharedSession] ,那么配置对象可以省略)

    // 2、创建会话(在这里可以决定采用delegate 或者block进行网络请求)

   //  3、创建会话任务(需要传递参数网址url 或者请求 request()),如果需要设置POST请求,那么需要定义可变的请求对象且设置请求方式。如果仅仅是get请求,那么直接使用网址或者直接使用不可变请求都行

  //   4、开始任务

 

 

- (IBAction)Post:(id)sender {

    // 会话配置对象总共有三种

//    NSURLSessionConfiguration

    // 1、 默认会话配置对象,请求到的数据存储在本地磁盘

//     defaultSessionConfiguration;

    // 2、临时会话配置,请求到的数据存储在内存(RAM)中,程序退出,数据启动销毁

//     ephemeralSessionConfiguration;

    // 3、后台会话配置,支持后台下载上传,请求到的数据存储在本地磁盘

//     backgroundSessionConfiguration

 

#pragma mark  网络请求第一步 产生会话配置对象(可选)

    NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];

    // 设置配置对象属性

    // 设置 是否允许蜂窝网络请求

    configure .allowsCellularAccess = YES;

    // 设置当在后台,wifi情况下,而且电量充足请求网络

    configure.discretionary = YES;

    // 设置网络请求时间,超过这个时间会打印错误信息

    configure.timeoutIntervalForRequest = 60;

    // 设置缓存策略,当本地无缓存数据进行网络请求

    configure.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

    

 

    

    // 产生会话对象

    // a、产生一个可变的网络请求

    NSURL *url = [NSURL URLWithString:POST];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    // b、设置请求的方式(post 或者 get)get请求默认不需要请求体和请求方式.

    // 请求方式分为POST GET请求

     // POST请求,采用密文输入(NSData类型)更安全,请求长度不限。

    // GET 请求采用明文输入,请求长度不超过256个字符(最古老时)

    [request setHTTPMethod:@"POST"];

     // c、设置请求体

    [request setHTTPBody:[PostBody dataUsingEncoding:NSUTF8StringEncoding]];

   

#pragma mark 第二步创建会话对象

    // 创建会话的三种方式

    // 1> sharedSession 使用共享会话,采用全局的证书,缓存等,可以不用创建配置对象(configure)

    // 2> sessionWithConfiguration:采用自定义的配置创建会话,采用 block 请求数据。

    // 3> sessionWithConfiguration: delegate: delegateQueue: 采用自定义的配置创建会话,采用delegate请求数据

    // 4、创建会话

 

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configure];

    

#pragma matk 第三步 创建会话任务

    //  5、会话任务 NSURLSessionTask 一般来说不直接使用,我们用其子类,子类有三个:

    // aNSURLSessionDataTask:用来前台下载数据,xmljson,图片等类型的数据。下载的数据不经过文件,直接提供给应用程序。

    // bNSURLSessionDownloadTask:  支持前,后台下载。下载的数据存储在本地,tmp文件夹路径下

    // cNSURLSessionUploadTask: 支持前后台上传,需要指定被上传的数据路径。

    // session中调用的方法 都是以当前类的类名开头

         //  DataTask 请求, 则session 使用dataTask开头方法,downLoadTask 则,session 使用 downLoadTask 方法

        NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        // response 关于数据的回应

        // error  关于请求数据的错误信息

        // data,这里的data是完整的数据

        NSLog(@"%@",response);

        NSLog(@"%@",error);

        NSLog(@"%@",data);

        

        // 解析数据

        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

        NSArray *arr = dic [@"news"];

        for (NSDictionary *dic in arr) {

            NSLog(@"%@",dic[@"title"]);

        }

        NSLog(@"%ld",dic.count);

        // 根据二进制数据获取图片

        UIImage *image = [UIImage imageWithData:data];

        // 回到主线程刷新UI

        dispatch_async(dispatch_get_main_queue(), ^{

            self.imageV.image = image;

        });

    }];

    

#pragma mark 第四步 开始任务

    [task resume];

    // ,根本解决办法 改协议,临时解决办法在Info.plist中添加  NSAppTransportSecurity 类型  Dictionary Dictionary 下添加  NSAllowsArbitraryLoads 类型 Boolean ,值设为  YES

    

    

    

}

 

 

    // get请求,会话采用全局会话

- (IBAction)Get:(id)sender {

    // 1、创建单例会话(全局会话)

    NSURLSession *session = [NSURLSession sharedSession];

    // 2、创建会话任务

    //因为是get请求,因此不需要定义可变请求

    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:ImageUrl] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        // 此处的data是完整的二进制数据

        UIImage *image = [UIImage imageWithData:data];

        //回到主线程刷新UI

        dispatch_async(dispatch_get_main_queue(), ^{

            self.imageV.image = image;

        });

    }];

    

    // 3、开始任务

    [task resume];

    

    

}

 

      // 采用默认会话配置,采用get请求,采用downLoadTask获取数据,采用block获取数据,

- (IBAction)Block:(id)sender {

    // 创建会话配置对象

    NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];

    

    // 创建会话对象

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configure];

    // 创建会话任务

    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:ImageUrl] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {

 

         // 从图片中获取二进制数据

        NSData *data = [NSData dataWithContentsOfURL:location];

        // 将二进制数据转换为图片

        UIImage *image = [UIImage imageWithData:data];

        //刷新UI

        dispatch_async(dispatch_get_main_queue(), ^{

            self.imageV.image = image;

        });

        

    }];

    

    [task resume];

}

 

// 采用get请求,采用dataTask的 delegate获取数据

- (IBAction)Delegate:(id)sender {

    // 创建默认配置会话

    NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];

    // 创建会话

    // 队列可以给,可以不给,不给系统默认给你创建一个子线程。

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configure delegate:self delegateQueue:nil];

    // 创建会话任务

    NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:ImageUrl]];

    // 开始任务

    [task resume];

    

}

 

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask

    didReceiveData:(NSData *)data{

    

    self.data = data;

    NSLog(@"%@",[NSOperationQueue currentQueue]);

    // 如果在设置会话代理的时候将代理线程设置为主线程,那么这里不需要重新回到主线程

    dispatch_async(dispatch_get_main_queue(), ^{

        self.imageV.image = [UIImage imageWithData:self.data];

    });

}

 

   // 采用默认配置

   // 采用get请求

  // 采用downLoadTaskDelegate获取数据

- (IBAction)DownLoadDelegate:(id)sender {

    

     // 第一步 创建会话配置对象

    NSURLSessionConfiguration *con = [NSURLSessionConfiguration defaultSessionConfiguration];

    // 第二步 创建会话

    NSURLSession *session = [NSURLSession sessionWithConfiguration:con delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    // 第三步 创建会话任务

    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:ImageUrl]];

    // 第四步 开始任务

    [task resume];

    

}

 

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{

    // downLoadTask 下载的数据存储在tmp文件下,因此根据路径获取二进制数据

    NSData *data = [NSData dataWithContentsOfURL:location];

    // 为图片视图赋值

    self.imageV.image = [UIImage imageWithData:data];

    

}

 

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask

      didWriteData:(int64_t)bytesWritten

 totalBytesWritten:(int64_t)totalBytesWritten

totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{

     // 求出下载的百分比

    float percent = totalBytesWritten / totalBytesExpectedToWrite * 1.0;

    NSLog(@"%f%%",percent * 100);

    

}

 

 

@end

 

0 0