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



以下代码

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上获得它?规格是否更改?

我想让任何人告诉我解决办法。请给我答案。

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

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

如果切换到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的相同方式。

我们花了很多努力才找到这个,但它对我们有效,我们不需要做太多改变。希望对你们有所帮助。

最新更新