无法在iOS11.3中的WKWebView POST请求上设置httpBody

时间:2018-07-13 10:45:34

标签: ios iphone ios11 wkwebview ios11.3

以下代码

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上没有得到它?规格更改了吗?

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

3 个答案:

答案 0 :(得分:3)

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)
}

答案 1 :(得分:1)

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

1。设置网页视图

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不为null,并且可以使用与UIWebView相同的方式继续。

我们花了很多功夫才能找到它,但是它对我们有用,我们不需要做太多改变。希望对您有帮助。

答案 2 :(得分:0)

在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()