网络基础及请求的封装
App内基本网络流程
NSURL、NSURLRequest、NSURLSession
URL ->NSURL NSURLSession
请求参数/设置->NSURLRequest->服务器
资源数据—————————->服务器
URL:[协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
HTTP请求
GET方法:从指定的资源请求数据(可缓存/长度限制)
POST方法:向指定的资源提交要被处理的数据(不缓存/长度无要求)
HTTP Header:请求和相应的补充信息(长度/编码类型/压缩方式/事件)
IOS中对请求地址的封装:NSURL
网络资源的路径
+(nullable instancetype)URLWithString:(NSString *)URLString;
+(nullable instancetype)URLWithString:(NSString *)URLString
relativeToURL:(nullable NSURL *)baseURL;
本地文件的路径
+(NSURL *)fileURLWithPath:(NSString *)path;
+(NSURL *)fileURLWithPath:(NSString *)path
relativeToURL:(nullable NSURL *)baseURL;
NSURLRequest
NSURLRequest对象代表一个请求,包含NSURL对象、请求方法、请求头、请求体等等
+(instancetype)requestWithURL:(NSURL *)URL;
+(instancetype)requestWithURL:(NSURL *)URL
cachePolicy:(NSURLRequestCachePolicy)cachePolicy
timeoutInterval:(NSTimeInterval)timeoutInterval
NSURLSession
1.负责接收、发送和处理请求
2.一个Session可以创建多个请求 ——> 浏览器打开多个网页
3.App可以创建不同配置的多个Session ——> 无痕模式&普通模式
4.封装Request为Task,控制状态、开始取消、进度
NSURLSession组织结构
创建NSURLSession会话
@property (class, readonly, strong) NSURLSession *sharedSession;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
delegate:(nullable id<NSURLSessionDelegate>)delegate
delegateQueue:(nullable NSOperationQueue *)queue;
配置会话NSURLSessionConfiguration
1.timeout时间
2.cookie缓存策略
3.最大并发数、是否支持蜂窝数据
4.其他网络行为的行为和策略
5.根据Configuration的不同,提供默认、后台以及自定义
创建NSURLSessionTask
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;
- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;
四种Task的区别
1.dataTask:处理简单的数据流 如JSON数据
2.downloadTask:大数据下载,断点续传和进度等
3.uploadTask:上传数据
4.streamTask:流数据
//
// GSCListLoader.m
// GSCApp1
//
// Created by gsc on 2024/5/20.
//
#import "GSCListLoader.h"
@implementation GSCListLoader
-(void)loadListData{
NSString *urlString = @"https://www.csdn.net";
NSURL *listURL = [NSURL URLWithString:urlString];
NSURLRequest *listRequest = [NSURLRequest requestWithURL:listURL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *dataTask = [session dataTaskWithRequest:listRequest];
}
@end
使用NSURLSession加载网络数据
NSURLSessionTask状态
-(void)resume; //恢复 调用resume开始执行
-(void)suspend; //默认状态 挂起
-(void)cancel; //取消
@property (readonly) NSURLSessionTaskState state;
@property (nullable, readonly, copy) NSError *error;
typedef NS_ENUM(NSInteger, NSURLSessionTaskState){
NSURLSessionTaskStateRunning = 0,
NSURLSessionTaskStateSuspended = 1,
NSURLSessionTaskStateCanceling = 2,
NSURLSessionTaskStateCompleted = 3,
}
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
completionHandler:(void(^)(NSData *_Nullable data,
NSURLResponse *_Nullable response,
NSError *_Nullable error))completionHandler;
通过Delegate处理Response
IOS 9新增ATS(App Transport Security)特性,默认要求使用HTTPS进行清秀
系统NSURLSession加载数据流程
1.创建&使用默认Session
2.通过地址和参数创建Task
3.开始&取消Task
4.在Handler中处理数据
//
// GSCListLoader.m
// GSCApp1
//
// Created by gsc on 2024/5/20.
//
#import "GSCListLoader.h"
@implementation GSCListLoader
-(void)loadListData{
NSString *urlString = @"https://www.csdn.net";
NSURL *listURL = [NSURL URLWithString:urlString];
// NSURLRequest *listRequest = [NSURLRequest requestWithURL:listURL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *dataTask = [session dataTaskWithURL:listURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"");
}];
[dataTask resume];
NSLog(@"");
}
@end