Android - 无法从 PHP 接收数据

Android - Cannot receive data from PHP

我使用 OkHttpURL 接收文本。 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();
}

使用浏览器,我收到 "success",但在我的 Android 应用程序中,我收到垃圾(请完整阅读):

它给出了一个 link (URL) 结尾为:?i=1,所以我用 okhttp 添加了这个参数:httpUrlBuilder.addQueryParameter("i", "1");

在此之后,我收到了另一个垃圾,link 以:?i=2 结尾,我试过了,但是服务器又发送了一个垃圾!以 ?i=3 结尾的 link。尝试此操作时,我收到 ?i=4 和...(每次发送请求时 i 都会上升)

怎么了?为什么我收不到成功信息?

您正在返回 text/html,默认为 PHP。显然浏览器呈现了你应该看到的东西,但实际上浏览器收到的响应有完整的 HTML.

也许改为发送 JSON?

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

UPDATE Ok, you now send JSON, but remarkably still get all that garbage!

为您的 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();
}

终于解决了! 我使用 Android WebViewCookieManager 来获取 PHP 发送的 text/html。 脚步: 1. 在 WebView 上设置 onPageFinishedWebView 不是 VISUAL)。 2. 通过 WebView 加载您的 URL。 3. 当onPageFinished调用时,使用CookieManager获取那个URL的cookie。 4. 添加该 cookie 以请求 headers.

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 body 文本,而不是纯文本。

2。此方法通过了人工检查系统 testcookie-nginx-module。我们使用真正的 cookie 来做到这一点。

3。您应该将查询参数添加到使用 WebView 加载的 URL(添加 ?key=value),但不应将其添加到使用 [= 加载的 URL 23=](加上httpUrlBuilder.addQueryParameter("key", "value"))。