一个精简的、使用 async-await 的 Swift HTTP 客户端,具有自动 JSON 响应解析功能。
通过 Xcode 添加 HTTP 客户端作为依赖,或直接添加到 Package.swift 中。
.package(url: "https://github.com/joemasilotti/HTTP-Client", .upToNextMinor(from: "0.1"))
import HTTP
let client = Client<Empty, Empty>()
let request = Request(url: url)
switch await client.request(request) {
case .success: print("Success!")
case .failure(let error): print(error.localizedDescription)
}
当响应代码超出 200 范围时,将解析失败响应对象。
import HTTP
struct Registration: Codable {
let email: String
let password: String
}
struct User: Codable {
let id: Int
let isAdmin: Bool
}
struct RegistrationError: LocalizedError, Codable, Equatable {
let status: Int
let message: String
var errorDescription: String? { message }
}
let client = Client<User, RegistrationError>()
let registration = Registration(email: "joe@masilotti.com", password: "password")
let request = BodyRequest(url: url, method: .post, body: registration)
switch await client.request(request) {
case .success(let response):
print("HTTP headers", response.headers)
print("User", response.value)
case .failure(let error):
print("Error", error.localizedDescription)
}
如果可能,还会暴露状态码。
import HTTP
let client = Client<Empty, Empty>()
let request = Request(url: url)
switch await client.request(request) {
case .success(let statusCode):
print("Status code", statusCode)
case .failure(let error):
print("Status code", error.statusCode ?? "(none)")
}
也可以在 Request
上设置 HTTP 头部。
import HTTP
let client = Client<Empty, Empty>()
let headers = ["Cookie": "tasty_cookie=strawberry"]
let request = Request(url: url, headers: headers)
_ = await client.request(request)
如果您需要更精细的控制,可以直接使用 URLRequest
。
import HTTP
let client = Client<Empty, Empty>()
let request = URLRequest(
url: url,
cachePolicy: .reloadIgnoringLocalCacheData,
timeoutInterval: 42.0
)
_ = await client.request(request)
也可以为所有请求设置用户代理,并分配 "User-Agent"
头部。
import HTTP
HTTP.Global.userAgent = "Custom User Agent"
默认情况下,所有键到 JSON 的编码和解码都是通过转换为蛇形命名法 (snake case) 来完成的。
可以通过全局配置来更改此设置。
import HTTP
HTTP.Global.keyDecodingStrategy = .useDefaultKeys
HTTP.Global.keyEncodingStrategy = .useDefaultKeys