IOS网络基础学习二:NSURLSession发送GET与POST请求,DataTask代理方法

使用步骤

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<UITouch *> *)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);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值