Как я могу использовать символ # вместо? в URLQueryItem?

Если я создаю URL, как это:

    guard var urlComponents = URLComponents(url: "https://example.com/something", resolvingAgainstBaseURL: false) else {
        return
    }

    let queryItems = URLQueryItem(name: "token", value: token)
    urlComponents.queryItems = [queryItems]

    guard let urlWithQueryItem = urlComponents.url else {
        return
    }

Я хочу, чтобы конечный результат был примерно таким: https://example.com/something

Вместо значения по умолчанию https://example.com/something?token=7as78f6asd678768asd768asd678

(Я ищу что-то умнее, чем поиск и замена символа?)

Спасибо

2 ответа

Решение

Как уже отмечалось, объект URLQueryItem больше предназначен для использования со строками запросов против якорей / фрагментов. С учетом вышесказанного ниже приведена функция, которая поможет вам выполнить то, что задают ваши вопросы.

func constructURL(withURL urlBase: String, andFragmentFromQueryItem queryItem: URLQueryItem) -> URL?{

guard let url = URL(string:urlBase) else {
    return nil
}

guard var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) else {
    return nil
}

let fragmentKey = queryItem.name
let fragmentValue = queryItem.value ?? ""

urlComponents.fragment = "\(fragmentKey)=\(fragmentValue)"

guard let urlWithFragment = urlComponents.url else {
    return nil
}

return urlWithFragment

}

let url = constructURL(withURL:"https://example.com/something", 
andFragmentFromQueryItem: URLQueryItem(name: "token", value: "tokenValue"))
let urlString = url?.absoluteString 
print("\(urlString!)")

Вот ссылка на работающую Swift скрипку кода. http://play.swiftengine.io/code/8JKI3/2

Как указывает @rmaddy, есть определенная разница между значением? а также #. '?' вводит параметры запроса, которые являются частью URL. "#" вводит "фрагмент", который не считается частью URL.

Вы можете, однако, использовать URLComponents добавить фрагмент в URL. Просто используйте fragment свойство вместо:

urlComponents.fragment = "token=\(token)"
Другие вопросы по тегам