我想在按下应用程序中的按钮时显示使用 POST 请求从 Android 应用程序发送到简单 html 网站的数据。我正在托管网站和 php 文件来处理 xampp apache 中的 POST,我已经设置了服务器,以便我的智能手机上的应用程序可以通过本地 IP 和端口(192.168.x.xx:8080)访问它,但是我一直收到 404 错误未找到。你们能帮我吗?
处理 POST 请求的 PHP 文件:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['REQUEST_URI'] === 'siteteste/message_handler.php') {
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
if(isset($request->message)) {
$message = $request->message;
} else {
http_response_code(400);
echo "Error: Message field is missing";
}
} else {
http_response_code(404);
echo "Not Found";
}
?>
HTML 代码:
<body>
<div id="messageContainer"></div>
<script>
function fetchMessage() {
fetch('message_handler.php')
.then(response => response.text())
.then(messageHtml => {
document.getElementById('messageContainer').innerHTML = messageHtml;
})
.catch(error => console.error('Error fetching message:', error));
}
fetchMessage();
setInterval(fetchMessage, 5000);
</script>
</body>
发送POST请求的java类:
import android.os.AsyncTask;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class SendMessage {
public void sendMessage() {
new SendMessageTask().execute();
}
private class SendMessageTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
URL url = new URL("http://192.168.xx.xx:8080/siteteste/message_handler.php");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/json");
String message = "Atenção: O operador X do ponto Y do setor Z precisa de suporte!";
try (OutputStream os = con.getOutputStream()) {
byte[] input = message.getBytes("utf-8");
os.write(input, 0, input.length);
}
int responseCode = con.getResponseCode();
System.out.println("Response code: " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
每当我按下发送请求的按钮时,我都会收到 404 错误作为响应代码,但是当我检查 xampp 文件上的日志时,我可以看到我正在运行应用程序的设备可以访问服务器
192.168.xx.xx - - [05/Mar/2024:00:05:36 -0300] "POST /siteteste/message_handler.php HTTP/1.1" 404 9 "-" "Dalvik/2.1.0 (Linux; U; Android 12; SM-G780G Build/SP1A.210812.016)"
当我在浏览器上打开网站时,每当 fetchMessage() 函数更新时,我都会收到此错误(Chrome DevTools)
siteteste.html:13 GET http://192.168.xx.xx:8080/siteteste/message_handler.php 404 (Not Found)
我做错了什么? 非常感谢您的帮助,并对任何错误表示歉意,英语不是我的母语。
您所面临的问题,无论是 Android 应用程序在发送 POST 请求时收到 404 错误还是在尝试获取消息时浏览器错误,都可能源于 XAMPP Apache 设置中服务器和脚本路径的配置方式以及如何配置您在请求中引用了 PHP 脚本。 Android POST 请求问题
检查 PHP 文件位置:确保 message_handler.php 位于相对于 Web 服务器根目录的正确路径中。根据您尝试访问的 URL (http://192.168.15.72:8080/siteteste/message_handler.php),您的 message_handler.php 应该位于 XAMPP 安装的 htdocs 目录中名为 siteteste 的目录中。
正确的 PHP 脚本路径处理:条件 $_SERVER['REQUEST_URI'] === 'siteteste/message_handler.php' 可能无法按预期工作,因为 REQUEST_URI 包含前导斜杠 /,还可能包含更多路径信息,具体取决于您的服务器配置。尝试修改条件以正确反映路径,或者简单地删除此检查以测试是否到达脚本:
if ($_SERVER['REQUEST_METHOD'] === 'POST' && strpos($_SERVER['REQUEST_URI'], 'siteteste/message_handler.php') !== false) {
浏览器获取问题
不正确的获取方法:您的 JavaScript 获取调用未指定它是 POST 请求,并且不发送任何数据。但是,您的 PHP 脚本需要包含 JSON 数据的 POST 请求。如果您尝试使用 GET 获取消息,则需要一个单独的处理机制或端点,或者需要调整获取以匹配 PHP 对 POST 的期望:
function fetchMessage() {
fetch('message_handler.php', {
method: 'POST', // Specify the method
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ message: 'Your message here' }) // Send some data
})
.then(response => response.text())
.then(messageHtml => {
document.getElementById('messageContainer').innerHTML = messageHtml;
})
.catch(error => console.error('Error fetching message:', error));}
Same Path Issue: The JavaScript fetch path 'message_handler.php' assumes that the HTML file is in the same directory as message_handler.php. If your HTML file is not in the siteteste directory alongside message_handler.php, you'll need to adjust the fetch path to match the correct relative or absolute path.
一般调试技巧
检查文件权限:确保 message_handler.php 具有正确的文件权限,可供 Web 服务器读取和执行。 Apache 配置:检查 .htaccess 文件和 Apache 配置,了解可能影响 URL 解析方式的任何重写规则或配置。 日志:查看 Apache 的错误日志,以获取有关找不到该文件的原因的更详细消息。这些日志可以为路径解析问题或文件访问问题提供有价值的见解。
确保服务器的目录结构与您的 URL 路径匹配,并相应地调整您的请求处理和路径。