Communicate via HTTP easily in Swift
swift-http-client
Communicate via HTTP easily in Swift.
Installation
Swift Package Manager (Recommended)
Package
You can add this package to Package.swift, include it in your target dependencies.
let package = Package(
dependencies: [
.package(url: "https://github.com/uhooi/swift-http-client", .upToNextMajor(from: "0.4.0")),
],
targets: [
.target(
name: "<your-target-name>",
dependencies: ["HTTPClient"]),
]
)
Xcode
You can add this package on Xcode.
See documentation.
CocoaPods
This library is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'UHIHTTPClient', '~> 0.4.0'
Carthage
This library is available through Carthage. To install it, simply add the following line to your Cartfile:
github "uhooi/swift-http-client" ~> 0.4.0
How to use
You can just import HTTPClient to use it.
- Implement a request body structure that conforms to the
Encodableprotocol. (Optional)
struct RegisterUserRequestBody: Encodable {
let name: String
let description: String
}
- Implement a response body structure that conforms to the
Decodableprotocol.
struct RegisterUserResponseBody: Decodable {
let id: String
}
extension RegisterUserResponseBody {
func convertToUserID() -> UserID { .init(id: self.id) }
}
- Implement a request structure that conforms to the
Requestprotocol.
import HTTPClient
struct RegisterUserRequest: Request {
typealias ResponseBody = RegisterUserResponseBody
var path: String { "user/create_user" }
var httpMethod: HTTPMethod { .post }
var httpHeaders: [HTTPHeaderField: String]? { [.contentType: ContentType.applicationJson.rawValue] }
}
- Create an instance of the
HTTPClientclass and call therequestmethod.
struct UserID: Identifiable, Equatable {
let id: String
}
protocol VersatileRepository {
func registerUser(name: String, description: String, completion: @escaping (Result<UserID, Error>) -> Void)
}
import HTTPClient
final class VersatileAPIClient {
static let shared = VersatileAPIClient()
private let httpClient = HTTPClient(baseURLString: "https://example.com/api/")
}
extension VersatileAPIClient: VersatileRepository {
func registerUser(name: String, description: String, completion: @escaping (Result<UserID, Error>) -> Void) {
let requestBody = RegisterUserRequestBody(name: name, description: description)
httpClient.request(RegisterUserRequest(), requestBody: requestBody) { result in
switch result {
case let .success(responseBody):
completion(.success(responseBody.convertToUserID()))
case let .failure(error):
completion(.failure(error))
}
}
}
}
VersatileAPIClient.shared.registerUser(name: "Uhooi", description: "Green monster.") { result in
switch result {
case let .success(userID):
// Do something.
case let .failure(error):
// Do error handling.
}
}