Добавить больше данных к api, определенному в общем классе

#ios #swift

#iOS #swift

Вопрос:

Я вызываю веб-сервис следующим образом…

WebServiceClient.shared.getNearbyLocationsList(with.....

Это, в свою очередь, вызывает другой класс, подобный so..

 func getNearbyLocationsList(withParameters parameters: APIParameters, completionHandler: @escaping (Bool, [String: Any]?) -> Void) {
    guard let url = APIClient.shared.createWebServiceUrl(forPath: WebServicePath.googleLocationsApi, withParameters: .....
  

И здесь, эта часть WebServicePath.googleLocationsApi.. вызывает эту переменную в другом классе…

 static let googleLocationsApi = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
let googleKey = "YOUR GOOGLE KEY"
  

Таким образом, это будет вызываемый URL api. Но мой фактический URL местоположения выглядит примерно так…

 https://maps.googleapis.com/maps/api/place/nearbysearch/json?sensor=trueamp;location=10.123456,78.910111amp;radius=1000amp;key=googleKey
  

Таким образом, вся эта часть должна быть добавлена с URL, указанным выше в static let googleLocationsApi =.... :

 ?sensor=trueamp;location=10.123456,78.910111amp;radius=1000amp;key=Aqporjp9asdjhg425jhgjhgvbjhAJGFKJfkjgkj4kjakjfb
  

Здесь местоположение, радиус и ключ определены где-то в другом месте. Итак, как я могу создать структуру api, которая будет принимать эти значения и, следовательно, иметь окончательный api ..?

Ответ №1:

Вы можете использовать URLComponent для кодирования параметров запроса в URL. Пример:-

 var urlComponents = URLComponents(string: googleLocationsApi)!
urlComponents.queryItems = [
    URLQueryItem(name: "sensor", value: true),
    URLQueryItem(name: "location", value: "10.123456,78.910111")
]
urlComponents.url      // this should give you the url you expect.
  

Для получения более подробной информации перейдите сюда: — https://www.swiftbysundell.com/posts/constructing-urls-in-swift
Это отличный пост Джона Санделла, подробно объясняющий это

Ответ №2:

@Aks, ваш ответ правильный, я внес пару изменений, добавив функцию, с помощью которой вы можете передавать свои динамические параметры вместе с ним.

  let googleKey = "YOUR GOOGLE KEY"
 var urlComponents = URLComponents(string: googleLocationsApi)!
 urlComponents.queryItems = appendQueryItems(queryItems: ["sensor": true,"radius":1000, "location": "10.123456,78.910111", "key": googleKey])

 debugPrint(urlComponents.url!)
  

Определение функции

 func appendQueryItems(queryItems: [String: Any]) -> [URLQueryItem] {

    var urlQueryItems = [URLQueryItem]()
    for (key,value) in queryItems {
        urlQueryItems.append(URLQueryItem(name: "(key)", value: "(value)"))
    }

    return urlQueryItems
}