2026-03-08 18:09:07
帝国CMS可通过自定义PHP文件实现API接口获取文章数据,核心步骤包括创建API文件、处理请求参数、构建安全查询、返回JSON数据及实施安全控制。
一、创建自定义API文件文件位置与命名
在网站根目录或非公开目录(如/api/)下创建api.php文件,避免直接暴露在公开路径。
示例路径:/api/get_articles.php(可通过重命名或目录隐藏增强安全性)。
基础代码结构
引入帝国CMS核心文件以连接数据库:header('Content-Type: application/json; charset=utf-8'); // 设置JSON响应头require_once('../e/class/connect.php'); // 数据库连接require_once('../e/class/db_sql.php'); // 数据库操作类$link = db_connect();$empire = new mysqlquery($link);
参数接收与过滤
通过$_GET接收参数,使用(int)强制转换防止SQL注入:$classid = (int)$_GET['classid']; // 栏目ID$num = (int)$_GET['num'] > 0 ? (int)$_GET['num'] : 10; // 默认返回10条$token = $_GET['token'] ?? ''; // 简单Token验证
动态SQL查询
根据参数查询指定栏目的已审核文章,限制返回字段:$table = 'ecms_news'; // 默认新闻模型表$sql = $empire->query("SELECT title, titleurl, newstime, smalltext, titlepic FROM {$table} WHERE checked=1 " . ($classid ? "AND classid='$classid'" : "") . " ORDER BY newstime DESC LIMIT $num");
格式化返回数据
将查询结果转为JSON格式,包含状态码与文章列表:$articles = [];while ($r = $empire->fetch($sql)) { $articles[] = [ 'title' => $r['title'], 'url' => $r['titleurl'], 'time' => date('Y-m-d H:i:s', $r['newstime']), 'description' => $r['smalltext'], 'thumbnail' => $r['titlepic'] ?: '' ];}echo json_encode(['status' => 1, 'data' => $articles]);
释放资源
关闭数据库连接与结果集:db_close($link);$empire->free_result($sql);
IP白名单限制
在代码开头添加IP验证,仅允许特定IP访问:$allowed_ips = ['192.168.1.1', '127.0.0.1']; // 允许的IP列表if (!in_array($_SERVER['REMOTE_ADDR'], $allowed_ips)) { die(json_encode(['status' => 0, 'msg' => 'Access Denied']));}
Token验证
要求请求携带预设Token(如?token=abc123):$valid_token = 'abc123'; // 预设Tokenif ($token !== $valid_token) { die(json_encode(['status' => 0, 'msg' => 'Invalid Token']));}
参数过滤与预处理
对非数值参数使用预处理或转义(如addslashes),避免SQL注入。
请求URL
基础调用(获取栏目ID为2的5篇文章):
返回数据结构
{ "status": 1, "data": [ { "title": "文章标题", "url": "/news/1.html", "time": "2024-04-05 10:30:00", "description": "文章简介...", "thumbnail": "分页支持
添加page参数,结合LIMIT实现分页:$page = (int)$_GET['page'] ?: 1;$offset = ($page - 1) * $num;$sql = $empire->query("SELECT ... LIMIT $offset, $num");
多模型适配
通过table参数动态指定数据表(如新闻、商品):$table = $_GET['table'] === 'product' ? 'ecms_product' : 'ecms_news';
缓存机制
使用Redis或文件缓存频繁请求的数据,减少数据库压力。
字段可选
通过fields参数控制返回字段(如?fields=title,url):$allowed_fields = ['title', 'url', 'time'];$requested_fields = explode(',', $_GET['fields'] ?? '');$select_fields = array_intersect($requested_fields, $allowed_fields);$fields_str = implode(',', $select_fields);$sql = $empire->query("SELECT {$fields_str} FROM ...");
通过以上方法,可快速为帝国CMS搭建安全、灵活的文章数据API接口,适用于移动端、小程序或跨站数据同步场景。