iOS——GET、POST请求方法(NSURLSession)

关于NSURLSession

使用NSURLSession,一般有两步操作:通过NSURLSession的实例创建task;执行task。
NSURLSessionTask,也就是task,可以把它当作所谓的任务。
NSURLSessionTask是一个抽象子类,它有三个可以直接使用的具体子类:NSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask。这三个类应用的三个基本网络任务:获取数据、上传文件、下载文件。与数据有关的NSURLSessionDataTask也可以胜任上传下载的任务,所以在iOS开发中经常使用。

GET方法

GET方法向服务器索取数据

// 1.创建一个网络路径
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://xxx/phonelogin?yourname=%@&yourpas=%@&btn=login", yourname, yourpass]];

// 2.创建一个网络请求
NSURLRequest *request =[NSURLRequest requestWithURL:url];

// 3.获得会话对象
NSURLSession *session = [NSURLSession sharedSession];

// 4.根据会话对象,创建一个Task任务
NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"从服务器获取到数据");
/*
对从服务器获取到的数据data进行相应的处理:
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableLeaves) error:nil];
}];

// 5.最后一步,执行任务(resume也是继续执行):
[sessionDataTask resume];

POST方法

POST方法向服务器提交数据并获取某些数据

// 1.创建一个网络路径
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://xxx/phonelogin"]];

// 2.创建一个网络请求,分别设置请求方法、请求参数(也叫请求体)
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";

NSString *args = [NSString stringWithFormat:@"yourname=%@&yourpass=%@&btn=login",yourname,yourpass];
request.HTTPBody = [args dataUsingEncoding:NSUTF8StringEncoding];

// 3.获得会话对象
NSURLSession *session = [NSURLSession sharedSession];

// 4.根据会话对象,创建一个Task任务
NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"从服务器获取到数据");
/*
对从服务器获取到的数据data进行相应的处理
*/
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableLeaves) error:nil];
}];

//5.最后一步,执行任务,(resume也是继续执行)
[sessionDataTask resume]; 

NSURLSessionDataDelegate代理方法

如果项目需要在网络请求数据的过程中,要做进一步的处理的话,需要调用NSURLSession的代理方法。

通常,使用代理方法需要先设置代理对象,但是通过查看NSURLSessionDataDelegate文档,我们可以看到如下,代理属性delegate为只读状态。
请添加图片描述
那么我们需要怎样设置代理对象呢?下面我们是代理方法的使用步骤。

在文件开头添加代理协议

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <NSURLSessionDataDelegate>  //遵循代理协议

@end

网络请求

// 1.delegateQueue参数表示协议方法将会在(NSOperationQueue)队列里面执行。(session的delegate属性是只读的,所以使用如下方法设置代理。)
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];

// 2.创建任务(因为要使用代理方法,就不需要block方式的初始化了)
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://xxx/phonelogin?yourname=%@&yourpass=%@&btn=login",yourname,yourpass]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSURLRequest requestWithURL:url]];

// 3.执行任务
[task resume];

代理行为

// 1.接收到服务器的响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
    
    //注意:
    //此处需要允许处理服务器的响应,才会继续加载服务器的数据。
    //若在接收响应时需要对返回的参数进行处理(如获取响应头信息等),那么这些处理应该放在该允许操作的前面。
    completionHandler(NSURLSessionResponseAllow);
}

// 2.接收到服务器的数据(此方法在接收数据过程会多次调用)
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
    // 处理每次接收的数据
    [self.receiveData appendData:data];
}

// 3.任务完成时调用(如果成功,error == nil)
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    
    if (error == nil) {
        /*
          请求完成,成功或者失败的处理
        */
    }
    else {
        NSLog(@"请求失败:%@", error);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值