Communicate via HTTP easily in Swift.
- Swift: 5.5+
- Xcode: 13.0+
- macOS: 11.3+
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.6.0")),
],
targets: [
.target(
name: "<your-target-name>",
dependencies: ["HTTPClient"]),
]
)
You can add this package on Xcode. See documentation.
This library is available through CocoaPods. To install it, simply add the following line to your Podfile
:
pod 'UHIHTTPClient', '~> 0.6.0'
This library is available through Carthage. To install it, simply add the following line to your Cartfile
:
github "uhooi/swift-http-client" ~> 0.6.0
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) async throws -> UserID }
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) async throws -> UserID { let requestBody = RegisterUserRequestBody(name: name, description: description) let responseBody = try await httpClient.request(RegisterUserRequest(), requestBody: requestBody) return responseBody.convertToUserID() } }
do { let userID = try await VersatileAPIClient.shared.registerUser(name: "Uhooi", description: "Green monster.") // Do something. } catch { // Do error handling. print(error) }
I would be happy if you contribute :)