博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS网络基础学习二:NSURLSession发送GET与POST请求,DataTask代理方法
阅读量:3730 次
发布时间:2019-05-22

本文共 5615 字,大约阅读时间需要 18 分钟。

文章目录

使用步骤

1.创建NSURLSession的会话

2.根据会话创建Task
3.执行Task

Task的类型

在这里插入图片描述
NSURLSessionTask是一个抽象类,我们无法直接运用到它,运用到的是它的三个子类。

如何获取NSURLSession?

1.获得共享的Session
+(NSURLSession*)sharedSession;
2.自定义的Session
+(NSURLSession*)sessionWithConfiguration:(NSURLSessionConfiguration )configuration delegate:(id< NSURLSessionDelegate >)delegate delegateQueue:(NSOperationQueue)queue;
需要传入配置信息,设置代理。

NSURLSessionTask

  • 常见方法
    -(void)suspend;//暂停
    -(void)resume;//恢复
    -(void)cancel;//取消
    -(void)cancelByProducingResumeData:(void(^)(NSData*resumeData))completionHandler;//取消任务

GET

-(void)dataTask{    //设置请求地址,GET请求,直接把请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接    NSURL *url=[NSURL URLWithString:LIST_URL];    //封装一个请求类    NSURLRequest *request =[NSURLRequest requestWithURL:url];    //1.创建Session    NSURLSession *session=[NSURLSession sharedSession];    //2.根据会话创建任务    NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        //在子线程中执行的        NSLog(@"----%@----",[NSThread currentThread]);        if(error==nil){            id objc=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];            NSLog(@"%@",objc);        }                //回归主线程,如果要做UI的操作,必须回到主线程        //[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:(BOOL)];        // [dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)]        //[NSOperationQueue mainQueue] addOperationWithBlock:<#^(void)block#>    }];    //3.启动任务    [dataTask resume];}

函数说明:

NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
request:传的请求;completionHandler:请求之后给咱们回调回来的信息;data:服务器回来的响应体;response:响应头;error:发送请求遇到的错误。
id objc=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
数据data是JSON数据,解析JSON数据。如果不知道解析出来的是什么数据类型,可以用id 数据类型接受。
回到主线程:
//回归主线程的三种方法
//[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:(BOOL)];
// [dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)]
//[NSOperationQueue mainQueue] addOperationWithBlock:<#^(void)block#>
}];

POST

POST请求地址,后面不能直接跟要向服务器传的参数的,只需要URL获得服务器地址。

因为要对请求作修改:所以用NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
设置方式;
设置请求体;

-(void)post{    //设置请求地址,后面不能跟给服务器传的参数的,只需要获得服务器地址    NSURL *url=[NSURL URLWithString:@"http://new.api.bandu.cn/book/listofgrade"];    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];        //设置请求方式    request.HTTPMethod=@"POST";    //设置请求体    request.HTTPBody=[@"grade_id=2" dataUsingEncoding:NSUTF8StringEncoding];        //1.创建Session    NSURLSession *session=[NSURLSession sharedSession];    //2.根据会话创建任务    NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {        //在子线程中执行的        NSLog(@"----%@----",[NSThread currentThread]);        if(error==nil){            id objc=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];            NSLog(@"%@",objc);        }                //回归主线程,如果要做UI的操作,必须回到主线程        //[self performSelectorOnMainThread:<#(nonnull SEL)#> withObject:<#(nullable id)#> waitUntilDone:(BOOL)];        // [dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)]        //[NSOperationQueue mainQueue] addOperationWithBlock:<#^(void)block#>    }];    //3.启动任务    [dataTask resume];}

DataTask代理方法

- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event{ //1.创建请求地址 NSURL *url=[NSURL URLWithString:LIST_URL]; //2.创建请求类 NSURLRequest *request=[NSURLRequest requestWithURL:url]; //3.创建会话 /** 配置: defaultSessionConfiguration;//默认的,使用的时候NSURLSession就相当于NSURLConnection ephemeralSessionConfiguration;//无痕浏览,不存储任何信息 backgroundSessionConfigurationWithIdentifier;后台下载,应用程序如果退出到后台,还想下载,并且下载完后还想通知你。 */ /* delegateQueue 表示协议方法在哪个线程中执行。 */ NSURLSession *session=[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //4.根据会话创建任务 NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request]; //5.启动任务 [dataTask resume];}

代理方法:

//接受服务器的响应-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{    NSLog(@"didReceiveResponse");    if(self.data==nil){        self.data=[[NSMutableData alloc]init];    }else{        self.data.length=0;    }    /*     SURLSessionResponseCancel = 0,  默认 请求之后不接收服务器的数据    NSURLSessionResponseAllow = 1,允许接受服务器的数据    NSURLSessionResponseBecomeDownload = 2,转成下载任务    NSURLSessionResponseBecomeStream,转成流     */    completionHandler(NSURLSessionResponseAllow);}
//接受到数据,该方法会被调用多次- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{    NSLog(@"didReceiveData");    //拼接数据    [self.data appendData:data];}
//数据请求完成,或者请求出现错误调用的方法- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{    NSLog(@"didCompleteWithError");    if(error==nil){        id objc=[NSJSONSerialization JSONObjectWithData:self.data options:NSJSONReadingMutableContainers error:nil];        NSLog(@"-%@",objc);    }}

转载地址:http://xpwin.baihongyu.com/

你可能感兴趣的文章
minikube 学习笔记 -- deployment 详解
查看>>
09.FormData对象实现二进制文件上传(实现图片预览功能)
查看>>
1.JSONP解决同源限制(基础)
查看>>
02.JSONP代码优化01(实现点击触发JSONP)
查看>>
03.JSONP代码优化02(实现客户端接受函数名和服务器返回函数名不同问题)
查看>>
04.JSONP代码优化03(封装JSONP函数)
查看>>
05.JSONP代码优化04(服务器端代码优化)
查看>>
案例:使用jsonp获取腾讯天气信息
查看>>
CORS跨域资源共享
查看>>
CORS跨域资源共享(方式二)
查看>>
jQuery 中的 Ajax
查看>>
RESTful风格的API
查看>>
Vue全家桶-前端路由
查看>>
ES6模块化--babel
查看>>
webpack打包工具的使用
查看>>
Vue 脚手架
查看>>
Element-UI 的基本使用
查看>>
01微信开发者工具文件介绍
查看>>
02模板语法wx:for
查看>>
03条件渲染wx:if
查看>>