一、AFN序列化
知识点:
1. 服务器默认返回的数据是 JSON的数据
2. 如果请求类型是XML的,服务器应该返回给我们的也是XML数据.
因此要修改AFN的解决方案:
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
3. 既不是JSON也不是XML:
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
4. 如果请求的是一个网页,需要设置返回类型为 text/html
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
#import "ViewController.h"
#import "AFNetworking.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation ViewController
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self httpData2];
}
- (void)json
{
//1. 创建会话管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSDictionary *dict = @{
@"username" : @"zy",
@"pwd" : @"zy",
@"type" : @"JSON"
};
//2. 发送GET请求
/*
param1:请求路径(不包含参数)
param2:字典(发送给服务器的数据~参数)
param3:progress 进度回调
param4:success 成功回调
task:请求任务
responseObject:响应体信息(JSON-->OC对象)
param5:failure 失败回调
error: 错误信息
响应头: task.response
*/
[manager GET:@"http://localhost:8080/MJServer/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
//注意: 默认返回的JSON数据
NSLog(@"%@---%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败--%@",error);
}];
}
// 返回的是XML
- (void)xml
{
//1. 创建会话管理者
AFHTTPSessionManager *manager= [AFHTTPSessionManager manager];
// 注意:如果返回的是XML数据,那么应该修改AFN的解决方案
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
NSDictionary *paramDict = @{
@"type":@"XML"
};
//2. 发送GET请求
[manager GET:@"http://localhost:8080/MJServer/video" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSXMLParser *parser = (NSXMLParser *)responseObject;
// 设置代理
parser.delegate = self;
// 开始解析
[parser parse];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败--%@",error);
}];
}
// 既不是JSON 也 不是XML
- (void)httpData
{
//1. 创建会话者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 注意: 如果返回的是xml数据,那么应该修改AFN解决方案:AFXMLParserResponseSerializer
// 如果返回的不是 xml,json数据. 那么应该修改AFN解决方案:
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//2. 发送GET请求
[manager GET:@"http://120.25.226.186:32812/resources/images/minion_01.png" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@-",[responseObject class]);
// UIImage *image = [UIImage imageWithData:responseObject];
// self.imageView.image = image;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败--%@",error);
}];
}
- (void)httpData2
{
//1. 创建会话者对象
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 注意: 如果返回的是xml数据,那么应该修改AFN解决方案:AFXMLParserResponseSerializer
// 如果返回的不是 xml,json数据. 那么应该修改AFN解决方案:
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
//2. 发送GET请求
[manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@-%@",[responseObject class],[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
} 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 *)attributeDict
{
NSLog(@"%@--%@",elementName,attributeDict);
}
@end
二、AFN监测网络状态改变 / 系统监测网络状态改变
知识点:
1. 需要获得一个网络状态监测管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
这个方法是一个单例方法. 需要 调用 startMonitoring 方法,开始监听
//1. 获得一个网络状态检测管理者
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//2. 监听网络的状态
/*
AFNetworkReachabilityStatusUnknown 未知
AFNetworkReachabilityStatusNotReachable 没有网络
AFNetworkReachabilityStatusReachableViaWWAN 蜂窝网络
AFNetworkReachabilityStatusReachableViaWiFi WIFI
*/
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知");
break;
default:
break;
}
}];
//3. 开始监听
[manager startMonitoring];
系统监测网络状态的方式:
1. 可以使用通知的方式来持续监听网络的改变.
#import "Reachability.h"
@interface ViewController ()
@property (nonatomic, strong) Reachability *r;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appleReachability) name:kReachabilityChangedNotification object:nil];
Reachability *r = [Reachability reachabilityForLocalWiFi];
[r startNotifier];
self.r = r;
}
// 移除监听
-(void)dealloc
{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
//1. 使用apple的方式来监听网络状态的改变(可以通过通知的方式持续监听)
- (void)appleReachability
{
if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN) {
NSLog(@"蜂窝网络");
return;
}
if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWiFi) {
NSLog(@"WIFI");
return;
}
NSLog(@"没有网络");
}