我已经设置了一个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迅速获取响应主体的方法?
答案 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即可执行此操作,但我想没有其他方法。无论如何,这个效果很好。