0

我正在尝试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?)

4

2 回答 2

5

/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!)
于 2019-01-02T22:36:02.563 回答
-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

这是我使用swift的第三天,我相信必须有更清洁的方法来处理这些细微差别。

于 2019-01-03T07:44:44.580 回答