Swift URLComponents неправильно преобразовывает пустые места - PullRequest
0 голосов
/ 29 августа 2018

У меня очень простой запрос GET в Swift 4, использующий URLSession для dataTask и URLComponents для создания URL / строки.

У меня проблема, как показано во фрагменте кода ниже

var url = URLComponents(string: "http://myServer.com:8086/query")
url?.queryItems = [
            URLQueryItem(name: "db", value: "Database"),
            URLQueryItem(name: "q", value: ("SELECT valueOne,valueTwo FROM \"TABLE\" WHERE \"valueOne\"='\(currValue)' ORDER BY time DESC LIMIT 1"))
            ]
NSLog((url?.url?.absoluteString)!)

/* 
   NSLog: http://myServer.com:8086/query?db=Database&q=SELECT2alueOne,valueTwo
   0.000000ROM222TABLE220WHERE222valueOne23D'currValue'                   
   0RDER2Y      0me      -8ESC2MIT2 
*/

Я попытался создать URL напрямую и применить addingPercentEncoding с urlQueryAllowed к части запроса строки, но я все еще получил тот же результат. Единственное, что частично сработало, - это заменить пустые пробелы в запросе на «+», но все еще была проблема с экранированными кавычками. Я довольно новичок в Swift, поэтому я предполагаю, что упускаю что-то очень очевидное. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Таким образом, ответ таков: NSLog не распечатывает строки с процентами Escaped правильно, с другой стороны, print. Лучше всего было бы просто установить точку останова в строке NSLog и проверить значение url, если оно верное, как оно и было.

0 голосов
/ 29 августа 2018

Я создал эту функцию для генерации URL. Вы можете использовать эту функцию для создания вашего URL с безопасными символами ASCII.

func urlGenretor() -> URL{
    var components = URLComponents()
    components.scheme = "https"
    components.host = "myServer.com:8086"
    components.path = "/query"
    let database = URLQueryItem(name: "db", value: "Database")
    let queryItem2 = URLQueryItem(name: "q", value: ("SELECT valueOne,valueTwo FROM \"TABLE\" WHERE \"valueOne\"='\(currValue)' ORDER BY time DESC LIMIT 1"))
    components.queryItems = [database,queryItem2]
    let url = components.url
    print(url!)
    return url!
...