如何在 React 中使用 Axios 正确调用 PHP 后端接口
技术百科
霞舞
发布时间:2026-01-26
浏览: 次 本文详解 react + axios 与 php 后端通信的关键配置:解决“cannot post”错误、正确读取请求数据、启用 cors 支持,并说明 restful 路由设计的注意事项。
在 React 应用中通过 Axios 向 PHP 文件发起 POST 请求时,出现 Cannot POST /src/api/addPeople.php 错误,根本原因并非代码语法问题,而是运行环境不匹配:React 的开发服务器(如 Webpack Dev Server 或 Vite)仅能托管静态资源(HTML/JS/CSS),无法解析或执行 PHP 脚本。PHP 必须由支持 PHP 的 Web 服务器(如 Apache、Nginx 或 PHP 内置服务器)来运行。
✅ 正确的运行环境配置
推荐使用 PHP 内置 Web 服务器进行本地开发(无需安装 Apache/Nginx):
# 在包含 addPeople.php 的目录(例如 ./src/api/)中执行: php -S localhost:8000 -t .
⚠️ 注意:-t . 表示当前目录为文档根目录;确保 addPeople.php 可被该服务器直接访问(如通过 http://localhost:8000/addPeople.php)。
然后在 React 中将 Axios 请求 URL 改为绝对路径(指向 PHP 服务地址):
function handleAddPeople(event) {
event.preventDefault(); // 防止表单默认提交
const name = nameRef.current.value;
const surname = surnameRef.current.value;
const age = ageRef.current.value;
axios({
method: 'post',
url: 'http://localhost:8000/addPeople.php', // ✅ 绝对 URL,指向 PHP 服务
data: { name, surname, age },
headers: {
'Content-Type': 'application/json' // 明确声明发送 JSON
}
})
.then(response => console.log('Success:', response.data))
.catch(error => console.error('Error:', error.response?.status, error.message));
}✅ PHP 端:安全接收并处理 JSON 数据
你的原始 PHP 代码存在多个关键问题:SQL 注入风险、变量名不一致($surname 未定义)、缺少 CORS 头、未处理预检请求(OPTIONS)。以下是修复后的 addPeople.php 示例:
'DB connection failed: ' . mysqli_connect_error()]));
}
// ✅ 安全读取 JSON 请求体
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) {
http_response_code(400);
die(json_encode(['error' => 'Invalid JSON payload']));
}
// ✅ 使用预处理语句防止 SQL 注入
$stmt = $con->prepare("INSERT INTO tabella1 (name, surname, age) VALUES (?, ?, ?)");
$stmt->bind_param("sii", $data['name'], $data['surname'], $data['age']);
if ($stmt->execute()) {
echo json_encode(['success' => true, 'message' => 'Record inserted']);
} else {
http_response_code(500);
echo json_encode(['error' => 'Query failed: ' . $stmt->error]);
}
$stmt->close();
$con->close();❌ 关于 “path/to/phpFile/functionName” 路由的说明
你提到希望实现类似 api.php/addPeople 的路由风格——这不是 PHP 原生支持的机制。PHP 文件本身不提供路由功能。若需此类 RESTful 设计,有以下两种专业方案:
-
方案一(轻量级):使用单一入口文件(如 api.php),通过 $_SERVER['PATH_INFO'] 解析路径并分发到对应方法:
// api.php $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $segments = explode('/', trim($path, '/')); if (count($segments) >= 2 && $segments[0] === 'api') { $action = $segments[1]; switch($action) { case 'addPeople': handleAddPeople(); break; default: http_response_code(404); echo 'Not found'; break; } }Axios 请求改为:url: 'http://localhost:8000/api.php/addPeople'
方案二(推荐):采用成熟框架(如 Slim、Laravel Lumen),它们内置路由、中间件和 ORM,大幅提升可维护性与安全性。
✅ 总结:关键检查清单
| 项目 | 正确做法 |
|---|---|
| 服务器环境 | ✅ 使用 PHP 内置服务器 / Apache / Nginx,禁用 React Dev Server 托管 PHP |
| URL 地址 | ✅ Axios 使用绝对 URL(如 http://localhost:8000/addPeople.php) |
| CORS 配置 | ✅ PHP 中设置 Access-Control-* 头,支持 POST 和 OPTIONS |
| 数据解析 | ✅ 用 file_get_contents('php://input') + json_decode() 读取 Axios 发送的 JSON |
| SQL 安全 | ✅ 强制使用 mysqli_prepare() + bind_param(),杜绝字符串拼接 |
| 错误处理 | ✅ 检查 JSON 解析结果、数据库连接、SQL 执行状态,并返回结构化错误响应 |
遵循以上规范,即可稳定实现 React ↔ PHP 的数据交互,并为后续扩展 REST API 奠定坚实基础。
# css
# word
# js
# json
# html
# 字符串
# 接口
# php
# mysql
# sql
# apache
# nginx
# 中间件
# laravel
# react
# vite
# webpack
# restful
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Python函数参数高级用法_默认值与可变参数解析
- Win10电脑C盘红了怎么清理_Windows10
- php8.4匿名类怎么用_php8.4匿名类创建与
- Win11怎么开启窗口对齐助手_Windows11
- Win11怎么设置虚拟内存_Windows 11优
- Windows11如何设置专注助手_Windows
- Python对象比较与排序_魔术方法解析【教程】
- VSC怎样在Linux运行PHP_Ubuntu系统
- Win10怎样安装Word样式库_Win10安装W
- c++怎么使用std::filesystem遍历文
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- php和redis连接超时怎么办_phpredis
- Win11声音忽大忽小怎么办 Win11音频增强功
- php做exe支持多线程吗_并发处理实现方式【详解
- c++如何判断文件是否存在_c++ filesys
- 如何在Golang中修改数组元素_通过指针实现原地
- Win11文件扩展名怎么显示 Win11查看文件后
- Python函数缓存机制_lru_cache解析【
- php订单日志怎么在swoole写_php协程sw
- 如何在 Go 结构体中正确初始化 map 字段
- Win11怎么设置闹钟_Windows 11时钟应
- Python函数接口稳定性_版本演进解析【指导】
- 本地php环境打开php文件直接下载_浏览器解析p
- Win11麦克风没声音怎么设置_Win11麦克风权
- php删除数据怎么软删除_添加is_del字段标记
- Windows电脑如何截屏?(四种快捷方法)
- Python网络日志追踪_请求定位解析【教程】
- PHP cURL GET请求:正确设置认证与自定义
- Win11怎么设置默认邮件应用_Windows11
- 当网站SEO排名下降时,如何应对?
- PHP 中如何在函数内持久化修改引用变量的指向
- 如何使用Golang log设置日志输出格式_Go
- 如何高效识别并拦截拼接式恶意域名 spam
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- 如何在Golang中处理二进制数据_Golang
- php嵌入式日志记录怎么实现_php将硬件数据写入
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- Python装饰器设计思路_功能增强机制说明【指导
- LINUX如何删除用户和用户组_Linux use
- LINUX怎么进行文本内容搜索_Linux gre
- 如何使用Golang实现云原生应用弹性伸缩_自动应
- Windows10如何删除Windows.old_
- 如何在 ACF 中正确更新嵌套多层 Group 字
- c# 在高并发场景下,委托和接口调用的性能对比
- php485支持哪些操作系统_php485跨系统支
- Win11怎么设置快速访问_Windows11文件
- 如何开启Windows的远程服务器管理工具(RSA
- Linux怎么禁止Root用户远程登录_Linux


QQ客服