         successClosure: @escaping ([String: Any]) -> Void,
         errorClosure: @escaping (SlackError) -> Void
     ) {
-        var components = URLComponents(string: "\(apiUrl)\(endpoint.rawValue)")
-        if parameters.count > 0 {
-            components?.queryItems = filterNilParameters(parameters).map { URLQueryItem(name: $0.0, value: "\($0.1)") }
-        }
-        guard let url = components?.url else {
+        guard let url = self.url(for: endpoint, parameters: parameters) else {
             errorClosure(SlackError.clientNetworkError)
             return
         }

        }
    }

    private func requestBodyData(data: Data, boundaryConstant: String, filename: String, filetype: String) -> Data? {
        let boundaryStart = "--\(boundaryConstant)\r\n"
        let boundaryEnd = "--\(boundaryConstant)--\r\n"

        parameters: [String: Any?],
        successClosure: @escaping ([String: Any]) -> Void, errorClosure: @escaping (SlackError) -> Void
    ) {
        guard
            let url = self.url(for: Endpoint.filesUpload, parameters: parameters),
            let filename = parameters["filename"] as? String,
            let filetype = parameters["filetype"] as? String
        else {
