Swift - 如何将params字典传递给函数并在get请求中发送它?

时间:2018-01-21 00:03:56

标签: swift dictionary parameters request

我有一个向服务器发送请求的函数。它有效。

问题: 我想在请求中传递参数。例如,client_id。此外,可以添加一些其他参数或根本不添加参数。 我该怎么做?

注意到,client_id是硬编码的(用于测试)

java.lang.StackOverflowError

}

在视图控制器上,我有这个填充tableview的功能。我必须传递一个参数:client_id。该函数也将从应用程序的其他位置调用。此外,在函数上,令牌通过GET传递给服务器。

stringx.replaceAll(/(\n.*?;(.*?);.*?;.*?;.*?;.+)(\n.*?;\2;.+)+/, '\ntitle\n$1\n$2\n')

1 个答案:

答案 0 :(得分:0)

您需要根据这些参数构建您的URL。构建URL的最佳方法是通过URLComponents struct:

func makeRequest<T>(endpoint: String,
                    parameters: [String: String],
                    completionHandler: @escaping (ApiContainer<T>?, Error?) -> ()) {

    guard var urlComponents = URLComponents(string: endpoint) else {
        print("Invalid endpoint")
        return
    }

    // Build an array containing the parameters the user specified
    var queryItems = parameters.map { key, value in URLQueryItem(name: key, value: value) }

    // Optional: Add default values for parameters that the user missed
    if !queryItems.contains(where: { $0.name == "token" }) {
        queryItems.append(URLQueryItem(name: "token", value: "123"))
    }

    // Add these parameters to the URLComponents
    urlComponents.queryItems = queryItems

    // And here's your final URL
    guard let url = urlComponents.url else {
        print("Cannot construct URL")
        return
    }

    print(url)
    // ... rest of your function
}

用法:

makeRequest(endpoint: "http://blog.local:4711/api/contacts/all", parameters: ["client_id": "42", "token": "xyz"], completionHandler: completionHandler)
// http://blog.local:4711/api/contacts/all?token=xyz&client_id=42

但是如果用户错过了一些必需的参数,该函数可以为它们添加默认值:

makeRequest(endpoint: "http://blog.local:4711/api/contacts/all", parameters: [:], completionHandler: completionHandler)
// http://blog.local:4711/api/contacts/all?token=123