переопределенный shouldInterceptRequest () не работает должным образом после добавления заголовка cookie в WebView для Android - PullRequest
0 голосов
/ 19 января 2019

У меня есть компонент WebView в действии, и при использовании loadUrl (initialUrl) я хочу добавить настроенный файл cookie. При добавлении cookie он возвращает ответ html-страницы, скажем, A, а внутри страницы A он публикует другой URL-адрес с cookie в качестве скрытой переменной на странице A. Вот код:

public class WebViewActivity extends FragmentActivity {
    private WebView mWebView;

    String test_url = "https://myexample.com/oamfed/idp/initiatesso";
    String cookieString = "cookieName=cookieValue" + "; path=/";


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mWebView = (WebView) findViewById(R.id.webViewId);

        loadData();

    }

    private void loadData(){
        mWebView.invalidate();
        mWebView.getSettings().setJavaScriptEnabled(true);

        mWebView.setWebViewClient(new WebViewClient(){
            // Handle API until level 21
            @SuppressWarnings("deprecation")
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                return getNewResponse_new(url);
                /*if(url.contains(test_url)) {
                    return getNewResponse_new(url);
                }else{
                    return super.shouldInterceptRequest(view, url);
                }*/
            }

            // Handle API 21+
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

                String url = request.getUrl().toString();
                WebResourceResponse new_response = getNewResponse_new(url);
                return new_response;
                /*if(url.contains(test_url)) {
                    return getNewResponse_new(url);
                }else{
                    return super.shouldInterceptRequest(view, url);
                }*/
            }

            private WebResourceResponse getNewResponse_new(String url) {
                String payload = "";
                try {
                    //==
                    // Configure the GET request
                    //OkHttpClient httpClient = getHttpClient(url);
                    OkHttpClient httpClient = new OkHttpClient();

                    // Configure headers
                    Headers.Builder hb = new Headers.Builder();
                    hb.add("Content-Type", "application/JSON");
                    hb.add("Accept", "application/JSON");

                    hb.add("Cookie",cookieString);

                    System.out.println("------- WebViewActivity - calling : url => " + url);
                    Request httpGet = new Request.Builder()
                            .url(url)
                            .headers(hb.build())
                            .build();

                    Response httpResponse = httpClient.newCall(httpGet).execute();

                    if (!httpResponse.isSuccessful())
                        throw new IOException("Unexpected code: " + httpResponse);

                    payload = httpResponse.body().string();

                    WebResourceResponse new_response =                    
                       new WebResourceResponse(
                            httpResponse.header("content-type","text/plain"),
                            httpResponse.header("content-encoding", "utf-8"),
                            httpResponse.body().byteStream()
                    );

                    return  new_response;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }

        });
        mWebView.loadUrl(balance_url);        
    }

    ...

}

При отладке «полезная нагрузка» показывает, что из загруженного URL-адреса возвращается правильный ответ, что означает, что cookie успешно добавлен. Но после завершения выполнения этого метода переопределения:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

                String url = request.getUrl().toString();
                WebResourceResponse new_response = getNewResponse_new(url);
                return new_response;
                /*if(url.contains(test_url)) {
                    return getNewResponse_new(url);
                }else{
                    return super.shouldInterceptRequest(view, url);
                }*/
            }

выдает эту ошибку в консоли:

E / InputStreamUtil: получено исключение при вызове available () для InputStream, возвращаемого из shouldInterceptRequest. Это приведет к сбою соответствующего запроса. java.io.IOException: закрыто на okio.RealBufferedSource $ 1.available (RealBufferedSource.java:438) в org.chromium.android_webview.InputStreamUtil.available (InputStreamUtil.java:44)

Что-то не так при использовании WebResourceResponse в shouldInterceptRequest ()? Правильно ли я его использовал?

Спасибо

Shawn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...