AFNetworking 是 iOS 和 macOS 开发中非常流行的网络请求框架,它为开发者提供了一个简单、高效、灵活的 API,用于处理 HTTP 网络请求、上传、下载、缓存、请求序列化等操作。AFNetworking 封装了常见的网络请求细节,使得开发者能够专注于业务逻辑,而不需要关心底层的细节。

1. AFNetworking 的特点

  • 高效的 HTTP 请求:支持基于 HTTP 和 HTTPS 的网络请求,支持 GET、POST、PUT、DELETE 等常见的 HTTP 方法。
  • 请求和响应的序列化:支持 JSON、XML、Plist 等格式的请求和响应序列化。
  • 文件上传和下载:提供了丰富的 API 来支持大文件的上传和下载,支持背景下载、上传进度回调等功能。
  • 多线程和缓存机制:内置了并发请求和缓存机制,能够有效优化性能。
  • 支持 SSL 验证和自定义认证:支持 HTTPS 的 SSL 验证、客户端认证等。
  • 友好的 API:简单易用的接口和强大的功能,使得开发者能快速上手。

2. AFNetworking 基本安装

1. 使用 CocoaPods 安装

在 Podfile 文件中添加:

pod 'AFNetworking', '~> 4.0'

然后运行:

pod install

2. 使用 Carthage 安装

在 Cartfile 中添加:

github "AFNetworking/AFNetworking" ~> 4.0

然后运行:

carthage update

3. 手动集成

下载 AFNetworking GitHub 仓库,并将其文件夹添加到你的项目中。

3. AFNetworking 常见用法

1. GET 请求

import AFNetworking

let manager = AFHTTPSessionManager()

manager.get("https://api.example.com/data", parameters: nil, headers: nil, progress: nil, success: { (task, responseObject) in
    // 成功回调
    if let response = responseObject as? [String: Any] {
        print("Response: \(response)")
    }
}, failure: { (task, error) in
    // 失败回调
    print("Error: \(error)")
})

2. POST 请求

import AFNetworking

let manager = AFHTTPSessionManager()

let parameters: [String: Any] = ["username": "test", "password": "1234"]

manager.post("https://api.example.com/login", parameters: parameters, headers: nil, progress: nil, success: { (task, responseObject) in
    // 成功回调
    if let response = responseObject as? [String: Any] {
        print("Login success: \(response)")
    }
}, failure: { (task, error) in
    // 失败回调
    print("Error: \(error)")
})

3. 上传文件

import AFNetworking

let manager = AFHTTPSessionManager()

let parameters: [String: Any] = ["key": "value"]
let fileURL = URL(fileURLWithPath: "/path/to/file.jpg")

manager.post("https://api.example.com/upload", parameters: parameters, constructingBodyWith: { (formData) in
    formData.appendPart(withFileURL: fileURL, name: "file", fileName: "file.jpg", mimeType: "image/jpeg", error: nil)
}, progress: { (progress) in
    print("Upload progress: \(progress.fractionCompleted)")
}, success: { (task, responseObject) in
    // 上传成功
    print("Upload success: \(responseObject)")
}, failure: { (task, error) in
    // 上传失败
    print("Upload error: \(error)")
})

4. 下载文件

import AFNetworking

let manager = AFHTTPSessionManager()

let fileURL = URL(fileURLWithPath: "/path/to/save/file.jpg")
let downloadTask = manager.download("https://www.example.com/file.jpg", to: { (tempFileURL, response) in
    return fileURL
}, progress: { (progress) in
    print("Download progress: \(progress.fractionCompleted)")
}, success: { (task, responseObject) in
    // 下载成功
    print("Download success")
}, failure: { (task, error) in
    // 下载失败
    print("Download error: \(error)")
})

5. 请求序列化与响应序列化

AFNetworking 默认支持 JSON 和 XML 的序列化,但也可以自定义序列化格式。

  • JSON 序列化
let manager = AFHTTPSessionManager()
manager.responseSerializer = AFJSONResponseSerializer()

manager.get("https://api.example.com/data", parameters: nil, headers: nil, progress: nil, success: { (task, responseObject) in
    // 成功回调
}, failure: { (task, error) in
    // 失败回调
})
  • 自定义序列化
let manager = AFHTTPSessionManager()

manager.requestSerializer = AFHTTPRequestSerializer()
manager.responseSerializer = AFXMLParserResponseSerializer()

manager.get("https://api.example.com/data", parameters: nil, headers: nil, progress: nil, success: { (task, responseObject) in
    // 成功回调
}, failure: { (task, error) in
    // 失败回调
})

6. 使用 JSON 参数

let manager = AFHTTPSessionManager()

let parameters: [String: Any] = ["username": "test", "password": "1234"]

manager.requestSerializer = AFJSONRequestSerializer()
manager.post("https://api.example.com/login", parameters: parameters, headers: nil, progress: nil, success: { (task, responseObject) in
    // 成功回调
}, failure: { (task, error) in
    // 失败回调
})

7. 网络请求进度

在上传和下载文件时,AFNetworking 支持回调进度。

let manager = AFHTTPSessionManager()

let fileURL = URL(fileURLWithPath: "/path/to/file.jpg")

manager.post("https://api.example.com/upload", parameters: nil, constructingBodyWith: { (formData) in
    formData.appendPart(withFileURL: fileURL, name: "file", fileName: "file.jpg", mimeType: "image/jpeg", error: nil)
}, progress: { (progress) in
    print("Upload progress: \(progress.fractionCompleted)")
}, success: { (task, responseObject) in
    // 上传成功
    print("Upload success")
}, failure: { (task, error) in
    // 上传失败
    print("Upload error: \(error)")
})

4. AFNetworking 高级用法

1. 网络请求的缓存机制

AFNetworking 支持请求结果缓存。你可以通过设置 cachePolicy 来指定缓存策略。例如:

manager.requestSerializer.cachePolicy = .returnCacheDataElseLoad

2. 自定义认证和 SSL 验证

AFNetworking 允许你配置自定义的身份验证和 SSL 验证。

  • 基本认证
let manager = AFHTTPSessionManager()
manager.authenticateUsingNSURLCredential(credential: URLCredential(user: "username", password: "password", persistence: .forSession))
  • 自定义 SSL 验证
manager.securityPolicy.allowInvalidCertificates = true
manager.securityPolicy.validatesDomainName = false

3. 使用后台任务

AFNetworking 还支持后台上传和下载任务,适用于需要在应用程序后台执行长时间操作的场景。你可以通过使用 NSURLSession 配合后台任务来实现这一功能。

5. 总结

  • AFNetworking 是一个非常强大且易于使用的网络请求库,能够帮助开发者简化网络请求的实现。
  • 它支持 HTTP 请求、上传/下载文件、JSON 和 XML 序列化、自定义认证等多种功能。
  • AFNetworking 提供了简洁的 API,极大地降低了 iOS 中网络请求的复杂度。
  • 然而,随着 Alamofire 的流行,很多 iOS 开发者开始转向使用 Alamofire。虽然 AFNetworking 依然得到维护,但你也可以考虑 Alamofire 作为替代。

无论选择哪个框架,合理的使用网络请求框架能够极大提高你的开发效率,并让网络请求的代码更加简洁和可维护。