Swift网络请求库Alamofire入门教程
Alamofire是一个使用Swift开发的网络请求库,其开发团队是AFNetworking的原团队。它语法简单,采用链式编程的思想,使用起来相当舒服。它建立在由 Foundation 框架提供的 URL 加载系统之上,Alamofire 的网络特性受到该系统功能的限制,应该始终记住并遵守其行为和最佳实践。
此外,Alamofire(以及 URL 加载系统)中的联网是异步完成的。异步编程可能会让不熟悉这个概念的程序员感到沮丧,但是有很好的理由这样做。
另外:AF命名空间和引用
以前的 Alamofire 文档使用了类似
Alamofire.request()
的示例。这个 API 虽然看起来需要 Alamofire
前缀,但实际上在没有它的情况下也可以。request
方法和其他函数在任何带有 import Alamofire
的文件中都是全局可用的。从 Alamofire 5 开始,此功能已被删除,被更改为 AF
,它是对 Session.default
的引用。这允许 Alamofire 提供同样的便利功能,同时不必每次使用 Alamofire 时都污染全局命名空间,也不必全局复制 Session
API。类似地,由 Alamofire 扩展的类型将使用 af
属性扩展来将 Alamofire 添加的功能与其他扩展分开安装方法
使用CocoaPods安装,
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '项目名称' do
pod 'Alamofire', '~> 5.0'
end
使用方法
发出请求
最简单的是,只需提供一个可以转换为 URL 的 String
:
import Alamofire
AF.request("https://httpbin.org/get").response { response in
debugPrint(response)
}
它的完整定义如下:
open func request<Parameters: Encodable>(
_ convertible: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,
headers: HTTPHeaders? = nil,
interceptor: RequestInterceptor? = nil
) -> DataRequest
HTTP Methods
HTTPMethod
类型列出了 RFC 7231 §4.3 中定义的 HTTP 方法:
public struct HTTPMethod: RawRepresentable, Equatable, Hashable {
public static let connect = HTTPMethod(rawValue: "CONNECT")
public static let delete = HTTPMethod(rawValue: "DELETE")
public static let get = HTTPMethod(rawValue: "GET")
public static let head = HTTPMethod(rawValue: "HEAD")
public static let options = HTTPMethod(rawValue: "OPTIONS")
public static let patch = HTTPMethod(rawValue: "PATCH")
public static let post = HTTPMethod(rawValue: "POST")
public static let put = HTTPMethod(rawValue: "PUT")
public static let trace = HTTPMethod(rawValue: "TRACE")
public let rawValue: String
public init(rawValue: String) {
self.rawValue = rawValue
}
}
这些值可以作为 method
参数传递给 AF.request
API:
AF.request("https://httpbin.org/get")
AF.request("https://httpbin.org/post", method: .post)
AF.request("https://httpbin.org/put", method: .put)
AF.request("https://httpbin.org/delete", method: .delete)
重要的是要记住,不同的 HTTP 方法可能有不同的语义,需要不同的参数编码,这取决于服务器的期望。例如,URLSession 或 Alamofire 不支持在
GET
请求中传递 body
数据,并将返回错误。如果需要使用 Alamofire 的 HTTPMethod
类型不支持的 HTTP 方法,可以扩展该类型以添加自定义值:
extension HTTPMethod {
static let custom = HTTPMethod(rawValue: "CUSTOM")
}
请求参数
Alamofire 支持将任何 Encodable
类型作为请求的参数,例如JSON或实现 Encodable
的结构体
struct Login: Encodable {
let email: String
let password: String
}
let login = Login(email: "test@test.test", password: "testPassword")
AF.request("https://httpbin.org/post",
method: .post,
parameters: login,
encoder: JSONParameterEncoder.default).response { response in
debugPrint(response)
}
或者
点击查看代码
let login = ["mail: "test@test.test", password: "testPassword"]
AF.request("https://httpbin.org/post",
method: .post,
parameters: login,
encoder: JSONParameterEncoder.default).response { response in
debugPrint(response)
}
或者
点击查看代码
let login = ["mail: "test@test.test", password: "testPassword"]
AF.request("https://httpbin.org/post",
method: .post,
parameters: login,
encoder: JSONParameterEncoder.default).response { response in
debugPrint(response)
}
请求数据
// 下载数据到文件中
AF.download("https://httpbin.org/image/png").responseData { (response) in
print("****************************")
debugPrint(response.value!)
if let data = response.value{
let image = UIImage(data: data)
let imageView = UIImageView(image: image)
self.view.addSubview(imageView)
}
}
设置Header
let headers: HTTPHeaders = [
"X-Mashape-Key": MY_API_KEY,
"Accept": "application/json"
]
Alamofire.request("https://mashape-community-urban-dictionary.p.mashape.com/define?term=smh", headers: headers)
.responseJSON { response in
debugPrint(response)
}
参考链接:
2. Custom Headers With Alamofire 4 and Swift 3
原编辑时间 2020-12-01 11:39
个性签名:时间会解决一切