php后端怎么编写接口给前端使用_PHP后端接口编写与前端调用详解
发布时间 - 2026-01-22 00:00:00 点击率:次PHP接口需设Content-Type为application/json并避免输出干扰,JSON请求须读php://input,跨域需正确处理OPTIONS预检,参数应过滤校验,数据库操作禁用SQL拼接。
PHP 接口必须返回 JSON 且设置正确 Content-Type
前端(尤其是 Fetch 或 Axios)默认期望收到 application/json 响应,如果 PHP 只用 echo json_encode($data) 而不设头,前端可能解析失败或触发 CORS 预检异常。
实操建议:
- 始终在输出前调用
header('Content-Type: application/json; charset=utf-8'); - 避免任何额外输出:确保文件无 BOM、前后无空行、无
var_dump()或print_r()残留 - 统一用
http_response_code(200)或对应状态码(如 400/401/500),前端可据此分支处理 - 示例最小安全响应:
header('Content-Type: application/json; charset=utf-8');
http_response_code(200);
echo json_encode(['code' => 0, 'msg' => 'success', 'data' => ['id' => 123]], JSON_UNESCAPED_UNICODE);
接收前端参数要区分请求方法和编码方式
GET 参数走 $_GET,POST 表单(application/x-www-form-urlencoded)走 $_POST,但 Fetch/Axios 默认发的是 application/json —— 此时 $_POST 为空,必须手动读取原始输入。
常见错误现象:前端发了 JSON 数据,PHP 却收不到任何值,$_POST 是空数组。
实操建议:
- 判断请求类型:
$_SERVER['REQUEST_METHOD'] === 'POST' - 检测是否为 JSON 请求:
strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false - 读取并解码:
$raw = file_get_contents('php://input'); $data = json_decode($raw, true); - 兼容表单和 JSON 的简易封装(可复用):
$input = $_POST;
if (empty($_POST) && strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
$raw = file_get_contents('php://input');
$input = json_decode($raw, true) ?: [];
}
跨域问题不能只靠 header('Access-Control-Allow-Origin: *')
简单 GET 请求加 Access-Control-Allow-Origin: * 能跑通,但一旦前端带认证(credentials: true)、自定义 Header(如 X-Token)或用 PUT/DELETE 方法,浏览器会先发 OPTIONS 预检请求 —— 此时若后端没响应预检,接口直接被拦在浏览器层,PHP 代码根本不会执行。
实操建议:
- 必须响应 OPTIONS 请求:
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_cod
e(200); exit; }
- 允许凭据时,
Access-Control-Allow-Origin不能为*,需指定具体域名(如https://your-fe.com) - 明确声明允许的 Header 和方法:
header('Access-Control-Allow-Headers: X-Token, Content-Type');、header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); - 把跨域逻辑抽成公共前置脚本(如
cors.php),所有接口开头require_once 'cors.php';
不要在接口里直接操作 $_GET/$_POST 做业务逻辑
裸用超全局变量容易引入安全漏洞(如 SQL 注入、XSS)、类型混淆(字符串 ID 当整数用)、缺失校验(前端绕过 JS 校验直接调用)。
实操建议:
- 统一用白名单方式提取参数:
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) ?: 0; - 对敏感操作强制验证身份:检查
AuthorizationHeader 中的 token,并解析验证(别手写 JWT 解码) - 数据库交互必须用 PDO 预处理或 ORM,禁用拼接 SQL
- 返回前过滤敏感字段(如密码、token 字段),哪怕数据库没查出来也要显式 unset
复杂点往往不在语法,而在边界:前端可能传空字符串、负数 ID、超长字符串、非法 JSON 结构——这些都要在接口入口就拦截,而不是让业务逻辑崩溃后才报 500。
# php
# js
# 前端
# json
# 编码
# 浏览器
# app
# access
# axios
# 后端
# ios
# 跨域
# 状态码
# red
# sql
# xss
# echo
# strpos
# if
# 封装
# pdo
# Token
# 全局变量
# 字符串
# 接口
# delete
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
jQuery中的100个技巧汇总
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
如何打造高效商业网站?建站目的决定转化率
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
详解Oracle修改字段类型方法总结
Laravel中的Facade(门面)到底是什么原理
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
如何快速生成可下载的建站源码工具?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
如何在万网ECS上快速搭建专属网站?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
详解Android——蓝牙技术 带你实现终端间数据传输
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Laravel如何实现事件和监听器?(Event & Listener实战)
如何在 Pandas 中基于一列条件计算另一列的分组均值
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
Laravel如何使用withoutEvents方法临时禁用模型事件
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel如何实现文件上传和存储?(本地与S3配置)
HTML 中动态设置元素 name 属性的正确语法详解
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
php json中文编码为null的解决办法
奇安信“盘古石”团队突破 iOS 26.1 提权
怎么用AI帮你为初创公司进行市场定位分析?
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel如何使用.env文件管理环境变量?(最佳实践)
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
如何用狗爹虚拟主机快速搭建网站?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
lovemo网页版地址 lovemo官网手机登录
高端企业智能建站程序:SEO优化与响应式模板定制开发
Laravel storage目录权限问题_Laravel文件写入权限设置
java ZXing生成二维码及条码实例分享
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面


