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;
  • 对敏感操作强制验证身份:检查 Authorization Header 中的 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构建动态前端界面