如何防止URLComponents()。port在查询之前添加问号(Swift / Xcode)

时间:2019-01-02 22:29:05

标签: swift nsurlcomponents

我正在尝试在我设计的应用中组成一个代表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 :(得分:3)

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

答案 1 :(得分:-2)

谢谢大家的回应。通过执行以下操作,无需使用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

这是我转瞬即逝的第三天,我确信必须有更清洁的方法来处理这些细微差别。