Как поставить действительный cookie постоянно в запросе сообщения залпа в Android? - PullRequest
1 голос
/ 28 сентября 2019

Я пытаюсь отправить запрос POST через Android Volley.У меня есть поддомен на infinityfree.net.Я загрузил в него php-файл с именем Check.php.

Check.php:

<?php
$response=array();
$response['value']="Returned";    
echo json_encode($response);
?>

Когда я пытался отправить POST-запрос в этот файл, я получал сообщение

"этому сайту требуется Javascript для работы, пожалуйста, включите Javascript в вашем браузере или используйте браузер с поддержкой Javascript"

Итак, я попытался поместить cookie (которыйЯ получил из хрома) с запросом POST.Я переопределил метод getHeaders () класса volley класса StringRequest следующим образом:

@Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = super.getHeaders();
        headers.put("Cookie","__test=c25bd97d5259049875f9d7f1c990f0ea; expires=Friday, 1 January 2038 at 05:25:55; path=/");
        return headers;
}

Затем я смог отправить запросы GET и POST и получить желаемые ответы идеально.Проблема в том, что после запуска приложения в течение нескольких дней, значение этого файла cookie становится бесполезным.Итак, мне нужно снова перейти в chrome, удалить старый cookie, открыть URL-адрес в chrome, затем скопировать содержимое нового cookie и вставить его в мое приложение в метод getHeaders (), чтобы он снова заработал.Через несколько дней проблема снова появляется и выдает ту же ошибку:

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

Как я могу решить эту проблему, чтобы мне не пришлось вручную обновлять cookie в моем приложении?Пожалуйста, поделитесь примером кода, если это возможно.

1 Ответ

0 голосов
/ 29 сентября 2019

Я нашел решение для вашей проблемы.Итак, основная идея такова:

Поместите WebView позади всего на начальном экране вашего приложения (чтобы оно было скрыто).Поместите пустой файл php в свой домен.Получите доступ к этому файлу php от этого WebView.Примите файл cookie, который будет отправлен с сервера, и сохраните его в SharedPreferences.Вы можете использовать этот файл cookie в остальной части вашего приложения, так как этот файл cookie создается недавно.

Мой пример кода: -

Sample.php:

<?php
?>

Сохраните файл cookie, используя WebView и CookieManager в MainActivity вашего приложения:

String url="http://your_domain.com/Sample.php";

CookieSyncManager.createInstance(mContext);
        cookieManager=CookieManager.getInstance();
        webView.getSettings().setJavaScriptEnabled(true);

        webView.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

                cookieManager.setAcceptCookie(true);
                cookie=cookieManager.getCookie(url);

                System.out.println(cookie);

                SharedPreferences sharedPreferences=getSharedPreferences("CookieDetails",MODE_PRIVATE);
                SharedPreferences.Editor editor=sharedPreferences.edit();
                editor.putString("cookieStart",cookie);
                editor.apply();

                //YOU CAN USE THE COOKIE AFTER THIS

            }
        });

        webView.setWebChromeClient(new WebChromeClient());
        webView.loadUrl(url);



        webView.clearCache(true);
        webView.clearHistory();

        cookieManager.removeAllCookie();
        cookieManager.removeSessionCookie();

Переопределите метод getHeaders() в своем классе StringRequest следующим образом:

@Override
    public Map<String, String> getHeaders() throws AuthFailureError
    {
        Map<String,String> headers=new HashMap<>();
        SharedPreferences sharedPreferences=mContext.getSharedPreferences("CookieDetails",Context.MODE_PRIVATE);
        String cookieStart=sharedPreferences.getString("cookieStart","");

        headers.put("Cookie",cookieStart+"; expires=Friday, 1 January 2038 at 05:25:55; path=/");

        return headers;
    }

После этого вы можете сделать запрос залпа GET и POST, как обычно.

Ура!

...