2015-08-07 2 views
4

В нашем WKWebView у нас есть запрос POST с несколькими частями, который мы должны проверить и условно обработать.В iOS, как читать данные формы нескольких частей в NSURLRequest, происходящих из WKWebView?

В настоящее время мы пытаемся использовать метод webView:decidePolicyForNavigationAction:decisionHandler: WKNavigationDelegate для доступа к NSURLRequest. (navigationAction.request).

Но когда мы проверяем запрос здесь, мы можем проверить, что это многочастная форма POST, однако [request HTTPBody] возвращает nil.

+0

точна такая же проблема! –

ответ

1

К сожалению, это ошибка в WebKit: ((:

В некоторых случаях можно использовать упомянутый обходной путь от Флорана Кривелло (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 
}]; 
0

Запрос может содержать поток тела. Если это так, и если вы можете изменить URL-запрос, вы можете потенциально прочитать из этого потока, а затем заменить запрос на новый, который использует объект данных тела.

В противном случае я считаю, что единственный способ справиться с этим - это зарегистрировать собственный обработчик протокола, который проверяет, нужно ли ему обрабатывать его, и если это так, обрабатывает его, а если нет, то он отказывается (если вы можете обнаружить его, не читая из потока) или переиздает его с помощью какого-то тега, который вы можете распознать (чтобы не допустить, чтобы ваш обработчик протокола касался его в следующий раз).

+0

no the stream is empty –

+0

Попробуйте обработчик протокола. – dgatwood

+0

Обработчик протокола не работает с WKWebView ... – JMI

1

Althrough я не нашел доку для этого, мой выстрел будет то, что по соображениям безопасности тело в запросе пуст, или назначается позже, чем в

Webview: decidePolicyForNavigationAction: decisionHandler: