Android - Не удается получить данные из PHP - PullRequest
0 голосов
/ 26 октября 2018

Я использую OkHttp для получения текста от URL. URL - это скрипт php.

PHP:

<?php
    echo 'success';
?>

Я получаю это с помощью следующего кода:

OkHttpClient hc = new OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .build();
String url = "http://hadifaridhadi.vcn.ir/com.hfapp.rokatshomar/imgofday.php";
HttpUrl.Builder httpUrlBuilder = HttpUrl.parse(url).newBuilder();
httpUrlBuilder.addQueryParameter("i", "3");
Request request = new Request.Builder()
    .url(httpUrlBuilder.build())
    .build();
Response response = null;
try {
    response = hc.newCall(request).execute();
} catch (Throwable e) {
    e.printStackTrace();
}
if (response != null) {
    result = response.body().string();
}

С помощью браузера я получаю "успех", но в моем приложении для Android я получил мусор (ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ПОЛНОСТЬЮ):

enter image description here

Он дает ссылку (URL), которая заканчивается на: ?i=1, поэтому я добавил этот параметр с помощью okhttp: httpUrlBuilder.addQueryParameter("i", "1");

После этого я получил еще один мусор, и эта ссылка заканчивается на: ?i=2, я пытался, но сервер отправил еще один мусор! Ссылка, которая заканчивается на ?i=3. Когда попробовал это, я получил ?i=4 и ... (i повышается каждый раз, когда отправляет запрос)

Что не так? Почему я не могу получить это сообщение об успехе?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Наконец-то решено!Я использовал Android WebView и CookieManager, чтобы получить text/html, отправленный PHP.Шаги: 1. Установите onPageFinished на WebView (WebView не ВИЗУАЛЬНО).2. Загрузите ваш URL по WebView.3. Когда вызывается onPageFinished, используйте CookieManager, чтобы получить cookie этого URL.4. Добавьте этот файл cookie для запроса заголовков.

WebView myWebView = new WebView(MainActivity.this);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        final String cookies = CookieManager.getInstance().getCookie("http://hadifaridhadi.vcn.ir/com.hfapp.rokatshomar/imgofday.php?req=hasimg");                                                                                           
        try {
            myWebView.destroy();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                String result = "";
                try {
                    OkHttpClient hc = new OkHttpClient.Builder()
                            .connectTimeout(10, TimeUnit.SECONDS)
                            .readTimeout(10, TimeUnit.SECONDS)
                            .writeTimeout(10, TimeUnit.SECONDS)
                            .build();
                    String url = "http://hadifaridhadi.vcn.ir/com.hfapp.rokatshomar/imgofday.php";
                    HttpUrl.Builder httpUrlBuilder = HttpUrl.parse(url).newBuilder();
                    httpUrlBuilder.addQueryParameter("req", "hasimg");
                    Request request = new Request.Builder()
                            .url(httpUrlBuilder.build())
                            .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36")
                            .addHeader("Cookie", cookies + "; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/")
                            .build();
                    Response response = null;
                    try {
                        response = hc.newCall(request).execute();
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                    if (response != null && response.isSuccessful()) {
                        result = response.body().string();
                    }
                } catch (Throwable e) {
                    e.printStackTrace();
                }
                // WE RECEIVED THE TEXT IN HTML (mine is 'yes')
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }}).start();
    }
}
myWebView.loadUrl("http://hadifaridhadi.vcn.ir/com.hfapp.rokatshomar/imgofday.php?req=hasimg");

Примечания:

1.Получается основной текст HTML, а не простой текст.

2.Этот метод проходит testcookie-nginx-module , систему проверки человеком.Для этого мы используем настоящие куки.

3.Вы должны добавить параметры запроса к URL-адресу, который вы загружаете с помощью WebView (добавьте ?key=value), но вы не должны добавлять это к URL-адресу, который вы загружаете с помощью OkHttp (добавьте с httpUrlBuilder.addQueryParameter("key", "value")).

0 голосов
/ 26 октября 2018

Вы возвращаете text/html, по умолчанию с PHP. Очевидно, что браузер отображает то, что вы должны видеть, но в действительности ответ, полученный браузером, содержал полный HTML.

Может быть, вместо этого отправьте JSON?

header('Content-Type: application/json');
echo json_encode(['message' => 'success']);
exit;

ОБНОВЛЕНИЕ Хорошо, теперь вы отправляете JSON, но все равно получаете весь этот мусор!

Попробуйте это для своего кода Android:

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url('http://hadifaridhadi.vcn.ir/com.hfapp.rokatshomar/imgofday.php')
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}
...