从 WKWebView 获取 JSON 文本
Get JSON text from WKWebView
我想从 WKWebView
中获取 http://www.devpowerapi.com/fingerprint 的内容
evaluateJavaScript("document.documentElement.innerHTML")
returns <head></head><body></body>
而不是实际的 JSON
是否可以使用 WKWebView 获取内容?
最简单的方法(适用于这种特定情况):
webView.evaluateJavaScript("document.getElementsByTagName('pre')[0].innerHTML", completionHandler: { (res, error) in
if let fingerprint = res {
// Fingerprint will be a string of JSON. Parse here...
print(fingerprint)
}
})
可能更好的方法:
所以 .innerHTML
returns HTML,不是 JSON header。 JSON header 是出了名的难以用 WKWebView
抓取的,但是您可以为此尝试这种方法。第一组:
webView.navigationDelegate = self
然后在WKNavigationDelegate
方法中:
public func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
let res = navigationResponse.response as! HTTPURLResponse
let header = res.allHeaderFields
print(header)
}
我不会说这是正确的解决方案,但它是一个解决方案 none,越少越好。请求将在 webView 的上下文中进行。
webView.evaluateJavaScript("""
var Httpreq = new XMLHttpRequest(); // a new request
Httpreq.open("GET",'http://www.devpowerapi.com/fingerprint',false);
Httpreq.send(null);
Httpreq.responseText;
""",
completionHandler: {
(innerHTML, error) in
print(innerHTML, error)
})
我确定您可以使用 this thread 中的任何 JavaScript 解决方案。
我想从 WKWebView
中获取 http://www.devpowerapi.com/fingerprint 的内容evaluateJavaScript("document.documentElement.innerHTML")
returns <head></head><body></body>
而不是实际的 JSON
是否可以使用 WKWebView 获取内容?
最简单的方法(适用于这种特定情况):
webView.evaluateJavaScript("document.getElementsByTagName('pre')[0].innerHTML", completionHandler: { (res, error) in
if let fingerprint = res {
// Fingerprint will be a string of JSON. Parse here...
print(fingerprint)
}
})
可能更好的方法:
所以 .innerHTML
returns HTML,不是 JSON header。 JSON header 是出了名的难以用 WKWebView
抓取的,但是您可以为此尝试这种方法。第一组:
webView.navigationDelegate = self
然后在WKNavigationDelegate
方法中:
public func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
let res = navigationResponse.response as! HTTPURLResponse
let header = res.allHeaderFields
print(header)
}
我不会说这是正确的解决方案,但它是一个解决方案 none,越少越好。请求将在 webView 的上下文中进行。
webView.evaluateJavaScript("""
var Httpreq = new XMLHttpRequest(); // a new request
Httpreq.open("GET",'http://www.devpowerapi.com/fingerprint',false);
Httpreq.send(null);
Httpreq.responseText;
""",
completionHandler: {
(innerHTML, error) in
print(innerHTML, error)
})
我确定您可以使用 this thread 中的任何 JavaScript 解决方案。