Fluent Builder Pattern

Fluent builder pattern for constructing complex URLRequest objects.

← Back
Language: swift | Tags: builder design-pattern networking fluent-api
final class RequestBuilder {
    private var method: String = "GET"
    private var url: URL?
    private var headers: [String: String] = [:]
    private var body: Data?
    private var timeout: TimeInterval = 30

    func method(_ method: String) -> RequestBuilder {
        self.method = method
        return self
    }

    func url(_ url: URL) -> RequestBuilder {
        self.url = url
        return self
    }

    func header(_ key: String, _ value: String) -> RequestBuilder {
        headers[key] = value
        return self
    }

    func jsonBody<T: Encodable>(_ body: T) throws -> RequestBuilder {
        self.body = try JSONEncoder().encode(body)
        headers["Content-Type"] = "application/json"
        return self
    }

    func timeout(_ timeout: TimeInterval) -> RequestBuilder {
        self.timeout = timeout
        return self
    }

    func build() throws -> URLRequest {
        guard let url = url else {
            throw BuilderError.missingURL
        }
        var request = URLRequest(url: url)
        request.httpMethod = method
        request.httpBody = body
        request.timeoutInterval = timeout
        headers.forEach { request.setValue($1, forHTTPHeaderField: $0) }
        return request
    }

    enum BuilderError: Error { case missingURL }
}

// Usage:
// let request = try RequestBuilder()
//     .method("POST")
//     .url(URL(string: "https://api.example.com/users")!)
//     .header("Authorization", "Bearer token")
//     .jsonBody(["name": "John"])
//     .build()