ios - 如何在 Swift 中从 WKWebView 获取 POST 请求正文?
问题描述
我已经设置了一个 API 来响应 POST 请求。由于我的应用程序的性质,我需要通过 WKWebView 来完成这个 POST 请求,而不是使用 URLSession 或 Alamofire。我计划在我的应用程序的其他地方使用数据 POST 响应正文。
我能够成功构建一个发布请求并通过以下方式加载它:
request = URLRequest(url: previouslyDefinedApiURL)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = previouslyDefinedBodyData
myWebView.load(request)
上面的代码完美运行。我的 Web 视图甚至显示来自我的 API 的正确响应。
我实现了 WKNavigationDelegate 方法,在加载请求时我的代码会挂接到该方法。
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
if let response = navigationResponse.response as? HTTPURLResponse {
// Somehow get the response body?
}
decisionHandler(.allow)
}
导航响应是 URLResponse 类型,它无法提取响应的正文内容,这是一个简单的 JSON。类似于以下内容:
{
status: "SUCCESS",
user_id: 1234,
transition_to: 'tabs'
}
有没有一种快速的方法可以在代码的本机端从 wkwebview 获取响应正文?
解决方案
我正在回答我自己的问题,因为我自己想出了如何做到这一点。也许我的问题不清楚。我的最终目标是将正文内容提取为字符串。
首先,我放弃了我使用的回调:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
// do stuff
}
相反,我使用了这个回调并在结果上执行了一些 javascript:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.getElementById(\"my-id\").innerHTML", completionHandler: { (jsonRaw: Any?, error: Error?) in
guard let jsonString = jsonRaw as? String else { return }
let json = JSON(parseJSON: jsonString)
// do stuff
})
}
id "my-id" 来自我在此服务后端构建的响应,以防万一 Web 视图将任何其他 HTML 包裹在我的响应周围。我的初衷是不必运行任何javascript就可以做到这一点,但我想没有其他办法了。无论如何,这工作得很好。
推荐阅读
- c++ - 如果字节缓冲区应该是无符号字符,我是否必须一直保持转换?
- excel - 比较(多个参数)并更新另一个单元格?
- javascript - JavaScript:重新定义链接到函数参数的对象
- reactjs - NextJS 和 Storybook 构建 `index.html` - 如何将 Storybook 作为同一域的一部分提供服务?
- r - nlsplot 在 r 中的几个子集中
- sql - 使用 DB2 失去除法精度
- python - Pandas 数据框 - 匹配两个数据框中的两列以更改第三列的值
- javascript - Mongo 查询未在我的主服务器中产生结果
- flutter - 如何实现像特殊代码这样的快照代码?
- java - 在 RxJava 中识别发射 observable