#ios #swift #core-foundation #urlcomponents
Вопрос:
Я попробовал следующий код, чтобы извлечь значение параметра из существующего URL-адреса
func getQueryStringParameter(url: String, param: String) -> String? {
guard let urlItems = URLComponents(string: url) else { return nil }
return urlItems.queryItems?.first(where: { $0.name == param })?.value
}
Я вызвал этот метод со следующими входными данными :
url = myprefix:un=test&add==1&token=bbbbbbbb
param = token
и я ожидал бы, что функция вернет значение токена «bbbbbbbb»
однако, хотя URL-адрес анализируется правильно (вот распечатка из отладчика), queryItems возвращает nil
po URLComponents(string: "myprefix:un=test&add==1&token=bbbbbbbb")
▿ Optional<URLComponents>
▿ some : myprefix:un=test&add==1&token=bbbbbbbb
- scheme : "myprefix"
- path : "un=testamp;add==1amp;token=bbbbbbbb"
Как я могу изменить функцию, чтобы элементы запроса были действительными и я мог правильно извлекать значения path
?
ИЗМЕНИТЬ: после изменения»: «на»? » похоже, что запрос все еще не проанализирован должным образом из-за UTF-8
форматирования URL-адреса, есть ли способ автоматически преобразовать его в представление ascii?
ASCII :
(lldb) po URLComponents(string: "myprefix?un=testamp;add=1amp;token=bbbbbbbb")?.queryItems
▿ Optional<Array<URLQueryItem>>
▿ some : 3 elements
▿ 0 : un=test
- name : "un"
▿ value : Optional<String>
- some : "test"
▿ 1 : add=1
- name : "add"
▿ value : Optional<String>
- some : "1"
▿ 2 : token=bbbbbbbb
- name : "token"
▿ value : Optional<String>
- some : "bbbbbbbb"
UTF-8 :
(lldb) po URLComponents(string: "myprefix?un=test&add==1&token=bbbbbbbb")?.queryItems?.first
▿ Optional<URLQueryItem>
▿ some : un=testamp;add==1amp;token=bbbbbbbb
- name : "un=testamp;add"
▿ value : Optional<String>
- some : "=1amp;token=bbbbbbbb"
Спасибо
Комментарии:
1. Я бы ожидал, что a
?
будет предшествовать запросу, я думаю, поэтому он рассматривает его какpath
элементы запроса, а не как элементы запроса… Так что ты можешь притвориться. Если queryItems.isEmpty, создайте новый URLhttp://something.com/thisone?pathYouGotFromURLComponents
-адрес, чтобы он был действительным?2. @Larme, Привет, я изменил значение
:
на?
, но мне все еще нужно изменить представление UTF-8 на ascii… знаете ли вы, как преобразовать его автоматически заранее ?3. Это проблема с кодировкой UTF8/ASCII? Я бы сказал, что почему ваш запрос в процентах экранирован? Это странно, не так ли? В вашем последнем примере значение «=» не указано в процентах.
4. Ваш URL-адрес кажется тарабарщиной. Кажется, что он частично закодирован по URL — адресу и в нем отсутствует ? для строки запроса как в некодированной, так и в закодированной форме
5. @Larme, в основном я использую фреймворк как сеанс аутентификации, чтобы получить URL-адрес из браузера. однако у него должно быть «:» в ascii, чтобы заставить обратный вызов работать, а остальная часть адреса действительно является UTF-8. Так, может быть, вы знаете способ преобразовать все utf-8 в ascii в строке ?