在iOS中,如何读取来自WKWebView的NSURLRequest中的多部分表单数据?
In iOS, how to read the multi part form data in the NSURLRequest originating from a WKWebView?
在我们的 WKWebView 中,我们有一个多部分表单 POST 我们需要检查并有条件地处理的请求。
目前,我们正在尝试使用 WKNavigationDelegate 的 webView:decidePolicyForNavigationAction:decisionHandler:
方法来访问 NSURLRequest。 (navigationAction.request
).
但是当我们检查这里的请求时,我们可以验证它是多部分形式 POST,但是 [request HTTPBody]
returns nil
。
请求可能包含正文流。如果是这样,并且如果您可以修改 URL 请求,您可能会从该流中读取,然后将请求替换为使用正文数据对象的新请求。
如果做不到这一点,我认为处理它的唯一方法是注册一个自定义协议处理程序,检查它是否需要处理它,如果需要,则处理它,如果不需要,要么拒绝它 (如果您可以在不从流中读取的情况下检测到它)或使用您可以识别的某种标签重新发布它(以避免您的协议处理程序下次接触它)。
虽然我没有找到这方面的文档,但出于安全原因,我的镜头是请求中的正文为空,或者分配晚于
webView:decidePolicyForNavigationAction:decisionHandler:
不幸的是,这是 WebKit 中的错误 :(( :
对于某些情况,可以使用 Florent Crivello 提到的解决方法 (https://bugs.webkit.org/show_bug.cgi?id=145410#c14):
NSString *javascriptPOSTRedirect = @"\
var form = document.createElement('form');\
form.method = 'POST';\
form.action = '<URL>';\
\
var input = document.createElement('input');\
input.type = 'text';\
input.name = '<key>';\
input.value = '<value>';\
form.appendChild(input);\
form.submit();";
[webView evaluateJavaScript:javascriptPOSTRedirect completionHandler:^(id _Nullable content, NSError * _Nullable error) {
// Your thing
}];
在我们的 WKWebView 中,我们有一个多部分表单 POST 我们需要检查并有条件地处理的请求。
目前,我们正在尝试使用 WKNavigationDelegate 的 webView:decidePolicyForNavigationAction:decisionHandler:
方法来访问 NSURLRequest。 (navigationAction.request
).
但是当我们检查这里的请求时,我们可以验证它是多部分形式 POST,但是 [request HTTPBody]
returns nil
。
请求可能包含正文流。如果是这样,并且如果您可以修改 URL 请求,您可能会从该流中读取,然后将请求替换为使用正文数据对象的新请求。
如果做不到这一点,我认为处理它的唯一方法是注册一个自定义协议处理程序,检查它是否需要处理它,如果需要,则处理它,如果不需要,要么拒绝它 (如果您可以在不从流中读取的情况下检测到它)或使用您可以识别的某种标签重新发布它(以避免您的协议处理程序下次接触它)。
虽然我没有找到这方面的文档,但出于安全原因,我的镜头是请求中的正文为空,或者分配晚于
webView:decidePolicyForNavigationAction:decisionHandler:
不幸的是,这是 WebKit 中的错误 :(( :
对于某些情况,可以使用 Florent Crivello 提到的解决方法 (https://bugs.webkit.org/show_bug.cgi?id=145410#c14):
NSString *javascriptPOSTRedirect = @"\
var form = document.createElement('form');\
form.method = 'POST';\
form.action = '<URL>';\
\
var input = document.createElement('input');\
input.type = 'text';\
input.name = '<key>';\
input.value = '<value>';\
form.appendChild(input);\
form.submit();";
[webView evaluateJavaScript:javascriptPOSTRedirect completionHandler:^(id _Nullable content, NSError * _Nullable error) {
// Your thing
}];