网络请求:NSURL,NSURLRequest,NSURLSession,NSJSONSerialization

21 8月
  • NSURL,NSURLRequest,NSURLSession
  • AFNetworking
  • NSJSONSerialization

NSURL,NSURLRequest,NSURLSession

IOS里网络请求用NSURL,NSURLRequest,NSURLSession来实现。

NSURL封装了URL地址,在它基础上NSURLRequest进一步封装了一些参数和请求头(如设置HTTPMethod,HTTPBody等),用NSURLSession发送并取得服务器返回的响应。例如webview发送网络请求:

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://zxljack.com/"]]];

上面比较简单并没有用NSURLSession。NSURLSession用于发送和接受网络请求,会将NSURLRequest封装成一个task,可以控制task的状态,开始或取消请求,通过delegate监听task状态,如进度等。一个APP中可以有多个NSURLSession,一个NSURLSession中可以处理多个NSURLRequest,即多个task。

有4种Task:
1.dataTask(简单数据如json)
2.downloadTask
3.uploadTask
4.streamTask流数据

NSString *urlString = @"http://xxxxx";

// 将网址转成NSURL对象
NSURL *listURL = [NSURL URLWithString:urlString];

// 将NSURL对象封装成NSURLRequest对象
NSURLRequest *listRequest = [NSURLRequest requestWithURL:listURL];

// 如果不需要创建特殊session,用sharedSession就行
NSURLSession *session = [NSURLSession sharedSession];

// 将NSURLRequest对象转成task,交给NSURLSession
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:listRequest];
[dataTask resume];

Task有3种状态:resume,suspend,cancel。创建完task后默认是suspend状态,要调用resume让task启动。

task启动后,还需要定义handler(可以通过block方式,也可以通过delegate),在handler中处理响应结果。

AFNetworking

也可以用第三方库AFNetworking来发起网络请求。本质上就是简化了代码:

#import <AFNetworking.h>

[[AFHTTPSessionManager manager] GET:@"http://xxx" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
    ...
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    ...
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    ...
}];

NSJSONSerialization

网络请求返回的结果可以用NSJSONSerialization将NSData数据转成JSON,也可以反过来将JSON转成NSData数据。

拿到JSON数据后,通常要创建Model来结构化数据。

NSURLSessionDataTask *dataTask = [session dataTaskWithURL:listURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    ...
    id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
    ...
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注