Android - 无法从 PHP 接收数据
Android - Cannot receive data from PHP
我使用 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();
}
使用浏览器,我收到 "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 WebView
和 CookieManager
来获取 PHP
发送的 text/html
。
脚步:
1. 在 WebView
上设置 onPageFinished
(WebView
不是 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")
)。
我使用 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();
}
使用浏览器,我收到 "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 WebView
和 CookieManager
来获取 PHP
发送的 text/html
。
脚步:
1. 在 WebView
上设置 onPageFinished
(WebView
不是 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")
)。