Использование компонентов swift URL для извлечения значения параметра из url

#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, создайте новый URL http://something.com/thisone?pathYouGotFromURLComponents -адрес, чтобы он был действительным?

2. @Larme, Привет, я изменил значение : на ? , но мне все еще нужно изменить представление UTF-8 на ascii… знаете ли вы, как преобразовать его автоматически заранее ?

3. Это проблема с кодировкой UTF8/ASCII? Я бы сказал, что почему ваш запрос в процентах экранирован? Это странно, не так ли? В вашем последнем примере значение «=» не указано в процентах.

4. Ваш URL-адрес кажется тарабарщиной. Кажется, что он частично закодирован по URL — адресу и в нем отсутствует ? для строки запроса как в некодированной, так и в закодированной форме

5. @Larme, в основном я использую фреймворк как сеанс аутентификации, чтобы получить URL-адрес из браузера. однако у него должно быть «:» в ascii, чтобы заставить обратный вызов работать, а остальная часть адреса действительно является UTF-8. Так, может быть, вы знаете способ преобразовать все utf-8 в ascii в строке ?