最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
AFNetworking中GET只传递一个参数
众所周知,苹果提供的 NSContention 框架在发送和接收请求时操作十分繁琐,使用起来极不方便。不仅需要区分各种请求并设置不同的参数,还经常要在多线程环境下操作,同时要对请求和返回的数据进行各种序列化操作,还要考虑请求数据的安全性等诸多问题。下面我们将重点介绍关于 AFNetworking 中 GET 请求只传递一个参数的相关内容。
一、早前的几个网络框架
- ASI 框架:曾被誉为 HTTP 终结者,功能强大,但存在 BUG 且已停止更新。
- MKNetworkKit:由印度开发者编写。
- AFN:一直保持更新状态。
AFNetworking 是专为 MAC/iOS 设计的一套网络框架,旨在简化网络操作。其开源地址为:https://github.com/AFNetworking/AFNetworking。AFN 专注于网络数据传输以及网络中多线程的处理。
二、AFNetworking 的使用
1. AFN 特性
- 登录传递参数时,只需传递字典即可,其中键名为参数名,键值为参数值。
- 自动在子线程中执行网络请求,执行完成后返回主线程。
- 返回的结果会自动序列化为
NSDictionary。
2. 使用 AFN 注意事项
AFHTTPRequestOperationManager封装了通过 HTTP 协议与 Web 应用程序进行通讯的常用方法。需要注意的是,该类实例化时并非单例,因为其方法名中没有shared字样。- 它涵盖了创建请求、响应序列化、网络监控以及数据安全等功能。
- 相关方法均以
AF开头。
3. AFN 能实现的功能
- 请求类型:支持 GET、POST、PUT、DELETE、HEAD 请求。
- 数据解析:支持 JSON 数据解析和 Plist 数据解析,但不支持 XML 数据解析。
- POST JSON:可进行 JSON 数据的 POST 请求。
- 文件操作:支持文件的上传和下载。
4. 使用步骤(可参考说明文档)
- 实例化请求管理器:首先需要实例化一个
AFHTTPRequestOperationManager对象。 - 设置请求的数据格式:默认格式为二进制,若有需要可进行修改。
AFHTTPRequestSerializer:二进制格式。AFJSONRequestSerializer:JSON 格式。AFPropertyListRequestSerializer:Plist 格式。
- 设置响应的数据格式:默认格式为 JSON,同样可根据需求修改。
AFHTTPResponseSerializer:二进制格式。AFJSONResponseSerializer:JSON 格式。AFPropertyListResponseSerializer:Plist 格式。AFXMLParserResponseSerializer:XML 格式。AFImageResponseSerializer:图片格式。AFCompoundResponseSerializer:组合格式。
- 处理 MIMEType 问题:如果响应者的 MIMEType 不正确,需要修改
acceptableContentTypes。 - 发送请求:调用相应方法发送请求,如 GET、POST 等。
关于修改 AFN 源码
通常在序列化时,若要支持 text/plain 等格式,可以一劳永逸地修改源代码,在 acceptableContentTypes 中进行修改即可。
AFN 进行 GET、POST 登录示例代码
#pragma mark - get/post登录
- (void)getLogin {
// 1. 管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2. 设置登录参数
NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };
// 3. 请求
[manager GET:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"GET --> %@, %@", responseObject, [NSThread currentThread]); // 自动返回主线程
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
/**
* 和上面的 GET 用法完全一样,只有一个 POST 参数不一样
*/
- (void)postLogin {
// 1. 管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2. 设置登录参数
NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };
// 3. 请求
[manager POST:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"POST --> %@, %@", responseObject, [NSThread currentThread]); // 自动返回主线程
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
AFN 进行网络数据解析示例代码
AFN 可用于获取 Plist、JSON 数据,但不支持自动解析 XML 数据,不过有专门的框架可用于处理 XML 解析,如 SAX、PULL、KissXML 等。
#pragma mark - get 数据解析
- (void)getJSON {
// 1. 请求管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2. 发起请求
[manager GET:@"http://localhost/videos.json" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
/**
* 不支持 XML 数据解析
*/
- (void)getXML {
// 1. 管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2. 设置返回数据类型
manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; // 先实例化一下
// 3. 发起请求
[manager GET:@"http://localhost/videos.xml" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
- (void)getPlist {
// 1. 管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2. 设置 response 类型
manager.responseSerializer = [AFPropertyListResponseSerializer serializer]; // 是 Response,别写成 request 了,修改为 plist 类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; // 这个可以直接往框架里面修改,项目中搜索 xuneng,找到定位点
// 3. 请求
[manager GET:@"http://localhost/videos.plist" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", responseObject);
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
用 AFN 来 POST JSON 数据示例代码
AFN 还可用于 POST JSON 数据、文件上传和下载等操作,上传和下载的详细说明可参考主页:https://github.com/AFNetworking/AFNetworking。
#pragma mark - post json数据与上传文件等
- (void)postJSON {
// 1. 管理器
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2. 设定类型(这里要设置 request - response 的类型)
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 这个决定了下面 responseObject 返回的类型
// manager.responseSerializer = [AFJSONResponseSerializer serializer];
// manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
// 2. 设置登录参数
NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };
// 3. 发送请求
[manager POST:@"http://localhost/postjson.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {
// NSLog(@"postjson--> %@", responseObject); // 这样显示 JSON 的话需要设置 text/plain
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
// 后续处理代码...
} failure: ^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
}
以上就是关于 AFNetworking 的详细介绍以及相关使用示例,希望能帮助你更好地理解和使用该框架。