网站美工建设意见凡科网免费建站
文章目录
- NSURLSession
- GET和POST区别
- GET方法
- GET请求步骤
- POST
- POST请求步骤
- NSURLSessionDataDelegate代理方法
- AFNetWorking
- 添加头文件
- GET
- POST
- 第一种
- 第二种
NSURLSession
使用NSURLSession
,一般有两步操作:通过NSURLSession
的实例创建task;执行task。
而NSURLSessionTask
,也就是task,可以把它当作所谓的任务。
NSURLSessionTask
是一个抽象子类,它有三个可以直接使用的具体子类:NSURLSessionDataTask
,NSURLSessionUploadTask
和NSURLSessionDownloadTask
。这三个类应用的三个基本网络任务:获取数据、上传文件、下载文件。与数据有关的NSURLSessionDataTask
也可以胜任上传下载的任务,所以在iOS开发中经常使用。
HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。
GET和POST区别
- 最主要的区别是GET是从API里面取数据,POST是向API里发数据。
- GET使用URL或Cookie传参。而POST将数据放在BODY中。
- GET的URL会有长度上的限制,则POST的数据则可以非常大。
- POST比GET安全,因为数据在地址栏上不可见。
- 对于GET只需要跑一趟就可以把数据传输到位,而POST则需要先去进行一个请求的过程,然后在把数据安排到位!
- GET 安全性非常低,POST安全性较高。但是执行效率却比POST方法好。
GET方法
GET请求步骤
- 确定请求路径URL(也就是后台提供的接口)。
- 创建请求对象NSURLRequest(如不加设置请求方法和请求头,则使用默认请求头和GET请求方法)。
- 创建会话对象NSURLSession
- 创建请求任务NSURLSessionDataTask(根据需求选择合适的任务类型)。
- 执行任务
- 解析请求返回的数据
//1.创建URL对象NSURL *url = [NSURL URLWithString:@"http://s2.s100.vip:9886/valountary/user/SendString"];//2.创建请求对象//第一个参数是你的URL//第二个参数是请求的缓存策略//第三个参数是设置请求超时时间NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];//3.设置请求方法为post[request setHTTPMethod:@"POST"];//4.设置请求头信息//key(头字段名(不区分大小写)):Content-Type,//Value(头字段值)为下面三种:(还是得根据后台给的来设置)//application/x-www-form-urlencoded(后台接收为分开的参数时,如?name=liyu&password=123)//application/json(后台接收为json对象时)//multipart/form-data(上传文件时)[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//5.设置请求体NSString *param = [NSString stringWithFormat:@"username:%@;password:%@", self.userName, self.passWord];//把拼接后的字符串转换为data,设置请求体(这个data就是请求体)request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];//6.建立会话 session支持三种类型的任务// NSURLSessionDataTask //加载数据// NSURLSessionDownloadTask //下载// NSURLSessionUploadTask //上传NSURLSession *session = [NSURLSession sharedSession];//7.创建请求任务//NSLog(@"```%@",request.HTTPBody);NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {//data就是你获取到的数据,你可以自行对其进行解析//error就是获取失败时出现的问题if (!error) {NSLog(@"-----%@", [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]);} else {NSLog(@"666");}}];//8.启动任务[dataTask resume];
POST
POST请求步骤
- 确定请求路径URL(也就是后台提供的接口)。
- 创建请求对象NSMutableURLRequest,设置请求方式为post。
- 设置请求体,根据后台所要求的数据格式以及类型(json、xml等等)设置。
- 若有些后台接口有请求头,则还应该设置请求头。
- 创建会话对象NSURLSession
- 创建请求任务NSURLSessionDataTask(根据需求选择合适的任务类型)。
- 执行任务
- 解析请求返回的数据
//1.创建URL对象NSURL *url = [NSURL URLWithString:@"你要获取的地址"];//2.创建请求对象//第一个参数是你的URL//第二个参数是请求的缓存策略//第三个参数是设置请求超时时间NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];//3.设置请求方法为post[request setHTTPMethod:@"POST"];//4.设置请求头信息//key(头字段名(不区分大小写)):Content-Type,//Value(头字段值)为下面三种:(还是得根据后台给的来设置)//application/x-www-form-urlencoded(后台接收为分开的参数时,如?name=liyu&password=123)//application/json(后台接收为json对象时)//multipart/form-data(上传文件时)[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//5.设置请求体NSString *param = [NSString stringWithFormat:@"username = %@ & pwd = %@", self.username.text, self.pwd.text];//把拼接后的字符串转换为data,设置请求体(这个data就是请求体)request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];//6.建立会话 session支持三种类型的任务// NSURLSessionDataTask //加载数据// NSURLSessionDownloadTask //下载// NSURLSessionUploadTask //上传NSURLSession *session = [NSURLSession sharedSession];//7.创建请求任务NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {//data就是你获取到的数据,你可以自行对其进行解析//error就是获取失败时出现的问题}];//8.启动任务[dataTask resume];
NSURLSessionDataDelegate代理方法
如果项目需要在网络请求数据的过程中,要做进一步的处理的话,需要调用NSURLSession的代理方法。
通常,使用代理方法需要先设置代理对象,但是通过查看NSURLSessionDataDelegate文档,我们可以看到如下,代理属性delegate为只读状态。
那么我们需要怎样设置代理对象呢?下面我们是代理方法的使用步骤。
#import <UIKit/UIKit.h>@interface ViewController : UIViewController
<NSURLSessionDataDelegate>
@property (nonatomic, copy) NSMutableData *receiveData;
@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",@"name",@"password"]];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);}
}
AFNetWorking
AFNetworking作为第三方库添加方式和之前博客中提到的Masonry,JSONModel等相似。
AFNetworking是一个功能非常强大的框架,主要是用于网络请求,把复杂的原生代码封装好,我们只需要简单的几步就可以完成网络请求。
添加头文件
#import "AFNetworking.h"//主要用于网络请求方法
#import "UIKit+AFNetworking.h"//里面有异步加载图片的方法
GET
AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];manager GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#> //第一个参数:NSString类型的请求路径,AFNetworking内部会自动将该路径包装为 一个url并创建请求对象//第二个参数:请求参数,此处为nil//第三个参数:进度回调,此处为nil//第四个参数:请求成功之后回调Block//第五个参数:请求失败回调Block
[manager GET:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {NSLog(@"GET 请求成功, %@", responseObject[@"date"]);//self.AFNetWorkTestGETDictionary = responseObject;} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"GET 失败");}];
POST
第一种
manager POST:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull uploadProgress)uploadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>//第一个参数:NSString类型的请求路径,AFN内部会自动将该路径包装为一个URL并创建请求对象//第二个参数:请求参数,以字典的方式传递,AFN内部会判断当前是POST请求还是GET请求,用来选择我直接拼接还是转换为NSData放到请求体中传递//第三个参数:进度回调,此处为nil//第四个参数:请求成功后对调Block//第五个参数:请求失败后回调Block
#import <UIKit/UIKit.h>@interface ViewController : UIViewController
<NSURLSessionDataDelegate>
@property (nonatomic, copy) NSMutableData *receiveData;
@property (nonatomic, copy) NSMutableDictionary *AFNetWorkTestPOSTDictionary;
@endAFHTTPSessionManager* manager = [AFHTTPSessionManager manager];//创建参数[self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];[self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];//发送POST请求[manager POST:@"要上传的URL" parameters:self.AFNetWorkTestPOSTDictionary progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {//responseObject是请求成功返回的相应结果,在AFN内部已经把相应结果转换为OC对象,通常是字典或者数组} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"POST Failed");}];
第二种
manager POST:<#(nonnull NSString *)#> parameters:<#(nullable id)#> constructingBodyWithBlock:<#^(id<AFMultipartFormData> _Nonnull formData)block#> progress:<#^(NSProgress * _Nonnull uploadProgress)uploadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>//第一个参数:请求路径(NSString类型)//第二个参数:非文件参数,以字典方式传递//第三个参数:constructingBodyWithBlock在该回调中拼接文件参数//第四个参数:progress//进度回调uploadProgress.completedUnitCount:已经上传的数据大小//uploadProgress.totalUnitCount:数据的总大小//第五个参数:success 请求成功的回调//task:上传Task//responseObject:服务器返回的响应体信息//第六个参数:failure 请求失败的回调//task:上传Task//error:错误信息
//创建会话管理者AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];//处理非文件的参数,模拟上传账号密码self.AFNetWorkTestPOSTDictionary = [[NSMutableDictionary alloc] init];[self.AFNetWorkTestPOSTDictionary setObject:@"Viper" forKey:@"userName"];[self.AFNetWorkTestPOSTDictionary setObject:@"Viper333" forKey:@"passWord"];//发送POST请求上传文件[manager POST:@"https://news-at.zhihu.com/api/4/news/before/20221023" parameters:self.AFNetWorkTestPOSTDictionary constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {// 混合的数据为头像// 获取头像// 把头像转化为DataUIImage *image = [UIImage imageNamed:@"1.png"];NSData *imageData = UIImagePNGRepresentation(image);//在BLOCK进行参数拼接//ImageUp.png是上传到服务器知乎以什么方式保存// 什么是MIME Type : 参考博客:https://www.cnblogs.com/jsean/articles/1610265.html[formData appendPartWithFileData:imageData name:@"file" fileName:@"1.png" mimeType:@"image/png"];//[formData appendPartWithFileURL:fileUrl name:@"file"fileName:@"Image7.png" mimeType:@"image/png" error:nil];//[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];} progress:^(NSProgress * _Nonnull uploadProgress) {// progress 进度回调;//uploadProgress.completedUnitCount:已经上传的数据大小//uploadProgress.totalUnitCount:数据的总大小NSLog(@"%f", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {NSLog(@"POST UP Succeed!");} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"POST UP Failed");}];
UIImage *image = [UIImage imageNamed:@"IMAGE.png"];NSData *imageData = UIImagePNGRepresentation(image);
第一个参数:要上传的文件二进制数据第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的第三个参数:该文件上传到服务后以什么名称保存第四个参数:该文件的MIMeType类型
[formData appendPartWithFileData:data name:@"file" fileName:@"Image.png" mimeType:@"application/octet-stream"];第一个参数:要上传的文件的URL路径第二个参数:文件参数对应的参数名称,此处为file是该台服务器规定的第三个参数:该文件上传到服务后以什么名称保存第四个参数:该文件的MIMeType类型第五个参数:错误信息,传地址
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"Image.png" mimeType:@"application/octet-stream" error:nil];第一个参数:要上传的文件的URL路径第二个参数:文件参数对应的参数名称,此处为file第三个参数:错误信息
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];