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

Я пытаюсь составить представителя 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 ]

0 голосов
/ 03 января 2019

Спасибо всем за ответ. Мне все это сошло с рук, выполнив следующее без необходимости использования 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, я уверен, что должны быть более чистые подходы, чтобы справиться с этими нюансами.

0 голосов
/ 03 января 2019

/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!)
...