A barebones async-await Swift HTTP client with automatic JSON response parsing.
Add HTTP Client as a dependency through Xcode or directly to Package.swift:
.package(url: "https://github.com/joemasilotti/HTTP-Client", branch: "main")
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)
}
Failure response objects are parsed when the response code is outside of the 200 range.
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)
}
When possible, a status code is also exposed.
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 headers can also be set on Request
.
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
can be used directly if you require more fine grained control.
import HTTP
let client = Client<Empty, Empty>()
let request = URLRequest(
url: url,
cachePolicy: .reloadIgnoringLocalCacheData,
timeoutInterval: 42.0
)
_ = await client.request(request)
A user agent can also be set for all requests, assigning the "User-Agent"
header.
import HTTP
HTTP.Global.userAgent = "Custom User Agent"
By default, all encoding and decoding of keys to JSON is done by converting to snake case.
This can be changed via the global configuration.
import HTTP
HTTP.Global.keyDecodingStrategy = .useDefaultKeys
HTTP.Global.keyEncodingStrategy = .useDefaultKeys