使用 AFHTTPRequestOperationManager这个网络管理者
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"需要请求的url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"请求成功");
} failure:^(AFHTTPRequestOperation *operation, NSError*error) {
NSLog(@"请求失败");
}];
使用 AFHTTPSessionManager 这个网络管理者
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session GET:@"需要请求的url" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"请求成功");
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"请求失败");
}];
-(void)get
{
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.封装参数
NSDictionary *dict = @{
@"username":@"Lion",
@"pwd":@"1314",
@"type":@"JSON"
};
//3.发送GET请求
/*
第一个参数:请求路径(NSString)+ 不需要加参数
第二个参数:发送给服务器的参数数据
第三个参数:progress 进度回调
第四个参数:success 成功之后的回调(此处的成功或者是失败指的是整个请求)
task:请求任务
responseObject:注意!!!响应体信息--->(json--->oc))
task.response: 响应头信息
第五个参数:failure 失败之后的回调
*/
[manager GET:@"需要请求的URL" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@--%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure--%@",error);
}];
}
[manager POST:@"需要请求的URL" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@--%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure--%@",error);
}];
-(void)download
{
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.确定请求路径
NSURL *url = [NSURL URLWithString:@"需要请求的URL"];
//3.创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//4.发送网络请求下载文件
/*
第一个参数:请求对象
第二个参数:progress 进度回调
downloadProgress
@property int64_t totalUnitCount;
@property int64_t completedUnitCount;
第三个参数:destination 让我们告诉系统应该把文件存放到什么地方
内部自动的完成剪切处理
第四个参数: completionHandler 完成之后的回调
response 响应头信息
filePath 文件最终的存储路径
error 错误信息
*/
[[manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//拼接文件的全路径
NSString *fullpath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"fullpath == %@",fullpath);
return [NSURL fileURLWithPath:fullpath];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSLog(@"%@",filePath);
}] resume];
}
-(void)upload
{
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.发送请求上传文件
/*
第一个参数:请求路径(NSString)
第二个参数:非文件参数
第三个参数:constructingBodyWithBlock 拼接数据(告诉AFN要上传的数据是哪些)
第四个参数:progress 进度回调
第五个参数:success 成功回调
responseObject:响应体
第六个参数:failure 失败的回调
*/
[manager POST:@"需要请求的URL" parameters:nil constructingBodyWithBlock:^(id _Nonnull formData) {
NSData *data = [NSData dataWithContentsOfFile:@"/Users/apple/Desktop/Snip20160409_148.png"];
//拼接数据
/*
第一个参数:文件参数 (二进制数据)
第二个参数:参数名~file
第三个参数:该文件上传到服务器以什么名称来保存
第四个参数:
*/
[formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success--%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure -- %@",error);
}];
}
@property (strong, nonatomic) NSURLSession *session;
//将session设置为全局的属性,方便发送网络请求
//在懒加载里面设置配置的信息,达到统一设置
#pragma makr - 懒加载
-(NSURLSession *)session
{
if (_session == nil) {
//设置配置信息
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
//统一设置请求超时
config.timeoutIntervalForRequest = 15.0;
//设置是否允许蜂窝网络访问
config.allowsCellularAccess = YES;
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
}
return _session;
}
默认情况:JSON AFJSONResponseSerializer
XML:AFXMLParserResponseSerializer
既不是XML也不是JSON:AFHTTPResponseSerializer
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
/*
1)afn内部默认已经完成了JSON解析工作
优点:方便
缺点:如果服务器返回的数据不是JSON会报错
*/
NSDictionary *dict = @{@"type":@"JSON"};
//2.发请求
[manager GET:@"需要请求的URL" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@---",error);
}];
-(void)xml
{
<NSXMLParserDelegate>代理协议
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置以XML的方式来解析数据
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
NSDictionary *dict = @{@"type":@"XML"};
//2.发请求
[manager GET:@"需要请求的URL" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--%@",[responseObject class],responseObject);
//1.创建解析器
NSXMLParser *parser = (NSXMLParser *)responseObject;
//2.设置代理
parser.delegate = self;
//3.开始解析
[parser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@---",error);
}];
}
-(void)otherHttpData
{
//1.创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//设置不做处理
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//2.发请求
[manager GET:@"需要请求的URL" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@--%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@---",error);
}];
}
#pragma mark NSXMLParserDelegate
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"%@--%@",elementName,attributeDict);
}
-(void)networkStatusChangeAFN
{
//1.获得一个网络状态监听管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//2.监听状态的改变(当网络状态改变的时候就会调用该block)
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
/*
AFNetworkReachabilityStatusUnknown = -1, 未知
AFNetworkReachabilityStatusNotReachable = 0, 没有网络
AFNetworkReachabilityStatusReachableViaWWAN = 1, 3G|4G
AFNetworkReachabilityStatusReachableViaWiFi = 2, WIFI
*/
switch (status) {
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G|4G");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
break;
default:
break;
}
}];
//3.手动开启 开始监听
[manager startMonitoring];
}
AFN使用技巧
1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类。
2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改这个工具类就可以了,而不用再一个一个的去修改。
3.该工具类一般提供一个单例方法,在该方法中会设置一个基本的请求路径。
4.该方法通常还会提供对GET或POST请求的封装。
5.在外面的时候通过该工具类来发送请求
6.单例方法:+ (instancetype)shareNetworkTools{
static XMGNetworkTools *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 注意: BaseURL中一定要以/结尾
instance=[[selfalloc]initWithBaseURL:[NSURL URLWithString:@"请求的URL"]]; }); return instance;
}