以下代码
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上没有得到它?规格更改了吗?
我希望任何人告诉我解决方法。请给我答案。
答案 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()