AFNetworking中GET只传递一个参数

2015年02月02日 14:04 0 点赞 0 评论 更新于 2025-11-21 15:59

众所周知,苹果提供的 NSContention 框架在发送和接收请求时操作十分繁琐,使用起来极不方便。不仅需要区分各种请求并设置不同的参数,还经常要在多线程环境下操作,同时要对请求和返回的数据进行各种序列化操作,还要考虑请求数据的安全性等诸多问题。下面我们将重点介绍关于 AFNetworking 中 GET 请求只传递一个参数的相关内容。

一、早前的几个网络框架

  1. ASI 框架:曾被誉为 HTTP 终结者,功能强大,但存在 BUG 且已停止更新。
  2. MKNetworkKit:由印度开发者编写。
  3. 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. 使用步骤(可参考说明文档)

  1. 实例化请求管理器:首先需要实例化一个 AFHTTPRequestOperationManager 对象。
  2. 设置请求的数据格式:默认格式为二进制,若有需要可进行修改。
    • AFHTTPRequestSerializer:二进制格式。
    • AFJSONRequestSerializer:JSON 格式。
    • AFPropertyListRequestSerializer:Plist 格式。
  3. 设置响应的数据格式:默认格式为 JSON,同样可根据需求修改。
    • AFHTTPResponseSerializer:二进制格式。
    • AFJSONResponseSerializer:JSON 格式。
    • AFPropertyListResponseSerializer:Plist 格式。
    • AFXMLParserResponseSerializer:XML 格式。
    • AFImageResponseSerializer:图片格式。
    • AFCompoundResponseSerializer:组合格式。
  4. 处理 MIMEType 问题:如果响应者的 MIMEType 不正确,需要修改 acceptableContentTypes
  5. 发送请求:调用相应方法发送请求,如 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 的详细介绍以及相关使用示例,希望能帮助你更好地理解和使用该框架。