#import "ViewController.h"
#import "AFNetworking.h"
#import "CZNetworkTool.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// 使用 AFN ,导入 AFNetworking.h
// AFHTTPRequestOperationManager开发中最常见的!负责发送网络请求.内部是对 NSUrlConnection的封装!
// AFHTTPSessionManager Xcode7之后使用最多的类!内部封装的时 NSUrlSession.
// AFHTTPSessionManager 中发送网络请求的方法名称和AFHTTPRequestOperationManager是一模一样的!
// AFNetworkReachabilityManager:监测网络状态(实时监测应用当前的网络情况 3G/4G WIFI m没有网络未知的网络状态)
// AFSecurityPolicy : 安全策略:用来做安全 HTTPS :安全需要服务器支持!
// AFURLRequestSerialization :序列化工具:只能使用他的子类!
// AFN 默认情况下,会解析 JSON数据!
// 如果服务器传回来的不是 JSON数据,如要手动执行解析器类型!
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[selfdemo2];
}
-(void)demo2{
// 上传文件的文件路径
NSString *path =@"/Users/liaojianguo/Desktop/hehua.jpg";
NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"file://%@",path]];
// 实例化自己写的网络工具类!目的:获得文件类型!
CZNetworkTool *tool = [CZNetworkToolsharedNetworkTool];
NSURLResponse *response = [toolgetFileTypeWithFilepath:path];
NSString *type = response.MIMEType;
// 使用 AFN实现文件上传! AFN只支持单文件上传! ASI支持多文件上传!
// 1.实例化网络工具管理类!
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
// 2.选择请求方法,发送请求!上传: POST
[manager POST:@"http://127.0.0.1/httpLogin/post/upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// FileURL:需要上传的文件的文件路径!
[formData appendPartWithFileURL:urlname:@"userfile"fileName:@"hehua"mimeType:typeerror:NULL];
} success:^(NSURLSessionDataTask *task,id responseObject) {
// 返回的是 OC数据!
NSLog(@"网络请求成功: responseObject:%@",responseObject);
} failure:^(NSURLSessionDataTask *task,NSError *error) {
//
NSLog(@"网络请求失败");
}];
}
// AFN 上传文件
-(void)demo1{
// 上传文件的文件路径
NSString *path =@"/Users/liaojianguo/Desktop/hehua.jpg";
// 实例化自己写的网络工具类!目的:获得文件类型!
CZNetworkTool *tool = [CZNetworkToolsharedNetworkTool];
NSURLResponse *response = [toolgetFileTypeWithFilepath:path];
NSString *type = response.MIMEType;
NSData *data = [NSDatadataWithContentsOfFile:path];
// 使用 AFN实现文件上传! AFN只支持单文件上传! ASI支持多文件上传!
// 1.实例化网络工具管理类!
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
// 2.选择请求方法,发送请求!上传: POST
// 参数1:urlString :网络接口
// 参数2:parameters :需要上传的普通文本参数!在开发中,一般都是传递字典!
// 参数3:^(id
// 参数4:success :成功之后的回调
// 参数5:failure :失败时候的回调
[manager POST:@"http://127.0.0.1/httpLogin/post/upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// FileData:需要上传的文件的二进制数据!
// name:服务器接受文件参数的 key值!
// fileName:文件在服务器上保存的名称!
// mimeType:上传文件的文件类型!
[formData appendPartWithFileData:dataname:@"userfile"fileName:@"荷花"mimeType:type];
} success:^(NSURLSessionDataTask *task,id responseObject) {
// 返回的是 OC数据!
NSLog(@"网络请求成功: responseObject:%@",responseObject);
} failure:^(NSURLSessionDataTask *task,NSError *error) {
//
NSLog(@"网络请求失败");
}];
}
#pragma mark - XML的解析
/**
// 请求的数据格式,发送给服务器的格式
self.requestSerializer = [AFHTTPRequestSerializer serializer];
AFHTTPRequestSerializer 二进制的数据格式(默认的)
AFJSONRequestSerializer JSON
AFPropertyListRequestSerializer PList
// 响应的解析器(默认直接解析JSON)
self.responseSerializer = [AFJSONResponseSerializer serializer];
AFHTTPResponseSerializer 二进制
AFJSONResponseSerializer JSON (默认的数据格式)
AFXMLParserResponseSerializer XML的解析器
AFImageResponseSerializer Image
(处理网络图片的问题, SDWebImage) */
- (void)getXML
{
NSString *urlStr =@"http://127.0.0.1/max/Contents.xml";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
// 指定我们的响应的解析器是解析XML(会返回NSXMLParser:对象)也就是需要SAX方式手动解析
manager.responseSerializer = [AFXMLParserResponseSerializerserializer];
// 假如想使用DOM进行解析XML,可以指定响应的类型是二进制。拿到二进制数据就可以进行DOM解析
// manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// GET方法
[manager GET:urlStrparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {
// 已经把反序列化完成的结果都直接返回了。可以更新UI了
NSLog(@"%@ %@", responseObject, [NSThreadcurrentThread]);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"%@", error);
}];
}
#pragma mark - 常规的方法
/**
POST方法,如果需要传递参数,也可以以字典的形式传递.
*/
/**post登录*/
- (void)postLogin
{
NSString *urlStr =@"http://127.0.0.1/httpLogin/login.php";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
NSDictionary *params =@{@"password" :@"zhang", @"username" :@"zhangsan"};
// POST方法
[manager POST:urlStrparameters:params success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"%@ %@", responseObject, [NSThreadcurrentThread]);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"%@", error);
}];
}
/**
1. 没有URL,只需要指定一个url的字符串
2. 网络请求是异步。完成以后的回调代码快直接是在主线程
3. 已经实现了反序列化
4. 如果get方法,需要传递参数,可以使用字段的方式传递。程序员不需要关心url里面的参数格式
*/
/**get登录*/
- (void)getLogin2
{
NSString *urlStr =@"http://127.0.0.1/httpLogin/login.php";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
NSDictionary *params =@{@"password" :@"zhang", @"username" :@"zhangsan"};
// GET方法
[manager GET:urlStrparameters:params success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"%@ %@", responseObject, [NSThreadcurrentThread]);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"%@", error);
}];
}
//get方法登录,一般不用
- (void)getLogin
{
NSString *urlStr =@"http://127.0.0.1/httpLogin/login.php?username=zhangsan&password=zhang";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
// GET方法
[manager GET:urlStrparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"%@ %@", responseObject, [NSThreadcurrentThread]);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"%@", error);
}];
}
- (void)getDemo
{
NSString *urlStr =@"http://127.0.0.1/max/Contents.json";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
// GET方法
[manager GET:urlStrparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {
// 已经把反序列化完成的结果都直接返回了。可以更新UI了
NSLog(@"%@ %@", responseObject, [NSThreadcurrentThread]);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"%@", error);
}];
NSLog(@"完成");
}
项目中有时会有这种情况,当界面正在请求数据,但数据为返回之前。返回到上一个界面,这种情况下,应取消此界面的网络请求。此篇就是为了处理此种情况下的操作,可 以取消单个请求队列,如果界面接口很多,可以一次性取消所有请求队列。
AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];
NSURLSessionDataTask *ljTask = [manager GET:@"url地址"parameters:@"入参"progress:^(NSProgress *_NonnulldownloadProgress) {
//数据请求进度
} success:^(NSURLSessionDataTask *_Nonnull task,id _Nullable responseObject) {
//请求成功
} failure:^(NSURLSessionDataTask *_Nullable task,NSError *_Nonnull error) {
//请求失败
}];
//取消单个网络请求
[ljTask cancel];
//取消所有的网络请求
[manager.operationQueuecancelAllOperations];