ios - 如何在 Swift 中从 WKWebView 获取 POST 请求正文?

标签 ios swift http webkit

我已经设置了一个 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 View 甚至显示来自 API 的正确响应。

我实现了 WKNavigationDelegate 方法,我的代码在加载请求时 Hook 到该方法。

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

有没有一种快速的方法可以从代码 native 端的 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”来 self 在此服务后端构建的响应,以防 Web View 在我的响应周围包含任何其他 HTML。我的初衷是在不运行任何 JavaScript 的情况下做到这一点,但我想没有其他办法。无论如何,这工作得很好。

关于ios - 如何在 Swift 中从 WKWebView 获取 POST 请求正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57532531/

相关文章:

ios - 带有自定义复选标记的swift ios tableview在滚动时不断重新选择单元格

ios - 在 iOS 游戏应用程序和 Swift 中使用 AdMob 插页式广告

ios - 文本底部 + 居中 UILabel iOS Swift

ios - SwiftUI NavigationLink 选定的值重置为零

swift - 快速从 firebase 数据库中读取子值

http - SPDY 是否会默认压缩我的所有内容?

android - HttpClient 在执行方法时失败

ios - NSBinaryStoreType 有什么优点?

iphone - 使用iOS6在Facebook的Xcode 4.5中从Facebook获取用户详细信息

node.js - NodeJS - 如何在不缓冲的情况下流式传输请求正文