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.

  1. Implement a request body structure that conforms to the Encodable protocol. (Optional)
struct RegisterUserRequestBody: Encodable {
    let name: String
    let description: String
}
  1. 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) }
}
  1. 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] }
}
  1. Create an instance of the HTTPClient class and call the request 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.
    }
}

GitHub

https://github.com/uhooi/swift-http-client