2016-09-03 5 views
2

Я пишу приложение, используя Google custom search engine.Неверное кодирование NSURLQueryItem для Google CSE

Я получил поисковой ID XXXXXXXX21914382657 1: 7 h9XXXXXXX (самая интересная часть полужирный).

Теперь я пытаюсь использовать NSURLQueryItem встроить свой идентификатор в URL с помощью:

let params = ["cx" : engineID,...] 
... 
components.queryItems = parameters.map { 
    NSURLQueryItem(name: String($0), value: String($1)) 
} 

Он должен процент бежать элемент в XXXXXXXX21914382657 1% 3A 7h9XXXXXXX (Это значение я получаю при использовании Google API-браузера во время тестирования он показывает, что было использовано url-платье). Он этого не делает. Я получаю url без выхода, никаких изменений. Если я использую escaped string в качестве идентификатора двигателя в этом сопоставлении, я получаю строку с экранированием XXXXXXXX21914382657 1% 253A 7h9XXXXXXX (в запрос добавляется дополнительная '25').

Может ли кто-нибудь сказать мне, как исправить это? Я не хочу использовать String, а затем конвертировать его в URL-адрес на NSURL(string: str)!. Это не изящно.

Edit:

Я использую приложение info.plist, чтобы сохранить идентификатор и я получить его по телефону:

String(NSBundle.mainBundle().objectForInfoDictionaryKey("ApiKey")!) 

ответ

1

Двоеточие позволяет в части запроса строки URL. Не должно быть необходимости их избегать.

Строго говоря, единственными вещами, которые обязательно должны быть закодированы в этой части URL-адреса, являются амперсанды, хэш-метки (#) и (при условии, что вы делаете запрос GET с кодировкой формы) равны знакам. Тем не менее, вопросительные знаки в теории могут вызвать проблемы, слэш технически недопустим (но работает очень хорошо), а точки с запятой технически разрешены (но опять же, работают на практике).

Colons, AFAIK, имеют только особое значение в контексте путей (если ОС рассматривает его как разделитель путей) и тем, что он отделяет схему (протокол) от остальной части URL-адреса.

Так что не беспокойтесь о том, что двоеточие не было закодировано, если по каким-то причинам API-интерфейсы API Google не установлены.