swift-http-client
Communicate via HTTP easily in Swift.
Table of Contents
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
Encodable
protocol. (Optional)
struct RegisterUserRequestBody: Encodable {
let name: String
let description: String
}
- Implement a response body structure that conforms to the
Decodable
protocol.
struct RegisterUserResponseBody: Decodable {
let id: String
}
extension RegisterUserResponseBody {
func convertToUserID() -> UserID { .init(id: self.id) }
}
- Implement a request structure that conforms to the
Request
protocol.
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
HTTPClient
class and call therequest
method.
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.
}
}
Contribution
I would be happy if you contribute :)