Как запретить URLComponents(). Port добавлять знак вопроса перед запросом (Swift/Xcode)

Я пытаюсь составить представителя URLComponents() в приложении я проектирую.

Вот код:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    var components = URLComponents()

    components.scheme = "http"
    components.host = "0.0.0.0"
    components.port = 9090
    let queryItemToken = URLQueryItem(name: "/predict?text", value: "what's your name?")
    components.queryItems = [queryItemToken]

    print(components.url as Any)
    }
}

Вот вывод приведенного выше фрагмента:

Optional(http://0.0.0.0:9090?/predict?text=what's%20your%20name?)

Приведенный выше вывод не работает на сервере из-за? между портом и запросом! Как я могу предотвратить URLComponents() от вставки этого избыточного? между портом и запросом!

Целевой вывод: Optional(http://0.0.0.0:9090/predict?text=what's%20your%20name?)

2 ответа

/predict часть является path, а не элемент запроса. text фактический параметр запроса.

Ты хочешь:

var components = URLComponents()
components.scheme = "http"
components.host = "0.0.0.0"
components.port = 9090
components.path = "/predict"
let queryItemToken = URLQueryItem(name: "text", value: "what's your name?")
components.queryItems = [queryItemToken]
print(components.url!)

Спасибо всем за ответ. Я сошел со всего этого, выполнив следующие действия без необходимости использования URLComponents().

Оказалось, что отправка некоторых необработанных специальных символов в запросе может иметь разрушительные последствия для запроса к сети.

А затем я использую словарь для замены некоторых специальных символов в необработанном вводе перед дальнейшей обработкой, все остальное работает гладко. Большое спасибо за внимание.

Итак, предполагая, что пользовательский ввод является вводом:

import UIKit
import Foundation

// An example of a user input
var input = "what's your name?"

// ASCII Encoding Reference: important to allow primary communication with the server
var mods = ["'": "%27",
        "’": "%27",
        " ": "%20",
        "\"" : "%22",
        "<" : "%3C",
        ">" : "%3E"]

for (spChar, repl) in mods {
        input = input.replacingOccurrences(of: spChar, with: repl, options: .literal, range: nil)
    }

let query = "http://0.0.0.0:9090/predict?text=" + input

Это мой третий день с swift, я уверен, что должны быть более чистые подходы, чтобы справиться с этими нюансами.

Другие вопросы по тегам