HTTP 客户端

一个精简的、使用 async-await 的 Swift HTTP 客户端,具有自动 JSON 响应解析功能。

安装

通过 Xcode 添加 HTTP 客户端作为依赖,或直接添加到 Package.swift 中。

.package(url: "https://github.com/joemasilotti/HTTP-Client", .upToNextMinor(from: "0.1"))

使用方法

带有空响应的 GET 请求

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)
}

带有成功和响应对象的 POST 请求

当响应代码超出 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)")
}

HTTP 头部

也可以在 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

如果您需要更精细的控制,可以直接使用 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"

Key 编码策略

默认情况下,所有键到 JSON 的编码和解码都是通过转换为蛇形命名法 (snake case) 来完成的。

可以通过全局配置来更改此设置。

import HTTP

HTTP.Global.keyDecodingStrategy = .useDefaultKeys
HTTP.Global.keyEncodingStrategy = .useDefaultKeys