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 
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.
    }
}
Contribution
I would be happy if you contribute :)