如何从Swift中的WKWebView获取POST请求正文?

时间:2019-08-17 00:55:14

标签: 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)

上面的代码运行完美。我的网络视图甚至显示来自我的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迅速获取响应主体的方法?

1 个答案:

答案 0 :(得分:0)

我正在回答自己的问题,因为我想出了自己解决问题的方法。也许我的问题不清楚。我的最终目标是将正文内容提取为字符串。

首先,我放弃了使用的回调:

const promises = []
for (let opportunities of actionOpportunities){
  const currentIDs = opportunities.id
  promises.push(axios.get('apiURL.com='+currentIDs, clientGet))
}

Promise.all(promises).then(allResults => {
  console.log(allResults)
}) 

相反,我使用此回调并对结果执行了一些javascript:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    // do stuff
}

id“ my-id”来自我在此服务后端构建的响应,以防万一Web视图将其他HTML包裹在响应周围。我的初衷是无需运行任何JavaScript即可执行此操作,但我想没有其他方法。无论如何,这个效果很好。