2

以下代码

var webView: WKWebView!

override func loadView() {
    super.loadView()
    self.webView = WKWebView(frame: .zero)
    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()

    var request = URLRequest(url: URL(string: "https://hosts")!)
    request.httpMethod = "POST"
    let bodyData = "data1=postData"
    request.httpBody = bodyData.data(using: .utf8)!

    self.webView.load(request)
}

我能够在 iOS 11.2 上加载的网站上获取 POST 参数,但在 iOS 11.3 上无法获取

为什么没有在 iOS 11.3 上获得它?规格变了吗?

我希望有人告诉我解决方法。请给我答案。

4

3 回答 3

5

WKWebView 不会像 UIWebView 那样将 POST 请求的 Content-Type 标头自动设置为 application/x-www-form-urlencoded。

var webView: WKWebView!

override func loadView() {
    super.loadView()
    self.webView = WKWebView(frame: .zero)
    view = webView
}

override func viewDidLoad() {
    super.viewDidLoad()

    var request = URLRequest(url: URL(string: "https://hosts")!)
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let bodyData = "data1=postData"
    request.httpBody = bodyData.data(using: .utf8)!

    self.webView.load(request)
}
于 2020-03-26T16:37:07.160 回答
2

在 11+ 上没有遇到此错误,但在 10.3.3 上出现过,但在 12+ 上还可以。我已经恢复到使用共享会话手动执行请求,而不是将加载的数据插入 WKWebView。

var firstRequest: URLRequest = URLRequest(url: requestUrl)
firstRequest.httpMethod = "POST"
firstRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
firstRequest.httpBody = "data1=\(requestData1)".data(using: .utf8)

URLSession.shared.dataTask(with: firstRequest) { [weak self] (data, response, error) in
    // check error, response and data to show useful error message
    if let data = data {
        self?.webView.load(body, mimeType: "text/html", characterEncodingName: "UTF-8", baseURL: baseUrl)
    }
}.resume()
于 2018-11-13T10:36:31.083 回答
1

如果您切换到 WKWebView,您可以使用以下方法。基本上你需要使用 WKURLSchemeHandler 协议:

1.设置webview

let config = WKWebViewConfiguration()
config.setURLSchemeHandler(self, forURLScheme: "my-custom-scheme")
let wkWebView = WKWebView(frame: .zero, configuration: config)

2.实现WKURLSchemeHandler协议

func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) {
  if let url = urlSchemeTask.request.url, url.scheme == "my-custom-scheme" {
    self.handleTermURLCallback(urlSchemeTask.request)
  }
}

通过使用它,您会发现回调中的请求 httpBody 不为空,您可以继续使用与 UIWebView 相同的方式。

找到这个需要付出很多努力,但它对我们有用,我们不需要做太多改变。希望对大家有帮助。

于 2020-03-23T00:52:37.457 回答