- 推荐方法:通过创建自定义PHP文件(更灵活、更安全)
- 辅助方法:修改DedeCMS核心文件(更直接,但有风险)
创建自定义PHP文件(推荐)
这是最推荐的方法,因为它不修改织梦的核心文件,升级DedeCMS时不会丢失你的API代码,并且可以更好地控制权限和逻辑。

步骤 1:创建API文件
在你的DedeCMS安装根目录下(与 index.php, dede 文件夹同级),创建一个新的文件夹,api,然后在 api 文件夹里创建一个新的PHP文件,article_list.php。
/你的织梦目录/
├── api/
│ └── article_list.php <-- 我们要创建的API文件
├── dede/
├── uploads/
├── index.php
└── ...
步骤 2:编写API代码 (article_list.php)
这个文件将负责接收请求、查询数据库并返回JSON格式的数据,为了安全,我们通常会做一些验证,比如检查请求来源或使用API密钥。
这里我们提供一个完整的示例,获取指定分类下的文章列表。
<?php
/**
* DedeCMS JSON API 示例:获取指定分类的文章列表
* 文件位置: /api/article_list.php
*/
// 1. 引入DedeCMS的核心配置文件,以便使用其数据库连接等
// 定义是后台目录,防止路径错误
define('DEDEADMIN', realpath(__DIR__ . '/../dede') . '/');
require_once(DEDEADMIN . '../include/common.inc.php');
// 2. 设置响应头为JSON格式
// 防止中文乱码,确保编码正确
header('Content-Type: application/json; charset=utf-8');
// 3. 获取GET请求参数
// 使用 (int) 过滤,确保是整数
$cid = isset($_GET['cid']) ? (int)$_GET['cid'] : 0; // 分类ID
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 10; // 获取数量
$limit = $limit > 0 ? $limit : 10; // 限制最小数量
// 4. 数据验证
if ($cid <= 0) {
// 如果分类ID无效,返回错误信息
$response = [
'code' => 400,
'msg' => '分类ID无效或未提供',
'data' => []
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
// 5. 查询数据库
// 使用织梦的 $dsql 全局变量进行查询
$sql = "SELECT id, title, description, litpic, pubdate, click
FROM dede_archives
WHERE typeid = {$cid}
AND arcrank = 0 // 只审核通过的文章
ORDER BY id DESC
LIMIT {$limit}";
$dsql->SetQuery($sql);
$dsql->Execute();
// 6. 处理查询结果,构建返回数据
$articles = [];
while ($row = $dsql->GetArray()) {
// 格式化日期
$row['pubdate'] = date('Y-m-d H:i:s', $row['pubdate']);
// 只返回需要的字段,避免暴露敏感信息
$articles[] = [
'id' => $row['id'],
'title' => $row['title'],
'description' => $row['description'],
'litpic' => $row['litpic'],
'pubdate' => $row['pubdate'],
'click' => $row['click']
];
}
// 7. 返回JSON数据
// JSON_UNESCAPED_UNICODE 确保中文字符不被转义
$response = [
'code' => 200,
'msg' => '获取成功',
'data' => $articles
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>
步骤 3:如何调用API
你可以通过浏览器或任何HTTP客户端(如Postman, JavaScript的fetch/Axios)来调用这个API。

示例URL:
http://你的域名/api/article_list.php?cid=1&limit=5
成功响应示例:
{
"code": 200,
"msg": "获取成功",
"data": [
{
"id": 123,
"title": "这是一篇测试文章",
"description": "这是文章的摘要内容...",
"litpic": "/uploads/20251020/123.jpg",
"pubdate": "2025-10-20 15:30:00",
"click": 88
},
{
"id": 122,
"title": "另一篇精彩的文章",
"description": "另一篇文章的摘要...",
"litpic": "/uploads/20251019/122.png",
"pubdate": "2025-10-19 10:00:00",
"click": 55
}
]
}
错误响应示例 (当未提供cid时):
{
"code": 400,
"msg": "分类ID无效或未提供",
"data": []
}
修改DedeCMS核心文件(不推荐,仅作了解)
这种方法可以直接在DedeCMS的现有页面(如列表页)上输出JSON,但会破坏原有模板,且升级时极易被覆盖。
步骤 1:找到并修改列表页模板文件
你想修改“文章列表页” (/templets/default/list_article.htm)。
步骤 2:在模板文件顶部添加PHP判断逻辑
打开 list_article.htm,在文件最顶部,<html> 标签之前,加入以下PHP代码:
<?php
// 判断是否是API请求,这里通过一个自定义的GET参数来判断,'format=json'
if (isset($_GET['format']) && $_GET['format'] == 'json') {
// 引入公共文件
require_once(dirname(__FILE__) . "/../include/common.inc.php");
// 获取当前栏目ID
$typeid = (int)$_GET['tid']; // 假设你通过tid传递栏目ID
// 查询数据库逻辑(与方法一类似)
$sql = "SELECT id, title, description, litpic, pubdate, click FROM dede_archives WHERE typeid = {$typeid} AND arcrank = 0 ORDER BY id DESC LIMIT 10";
$dsql->SetQuery($sql);
$dsql->Execute();
$articles = [];
while ($row = $dsql->GetArray()) {
$row['pubdate'] = date('Y-m-d H:i:s', $row['pubdate']);
$articles[] = [
'id' => $row['id'],
'title' => $row['title'],
'description' => $row['description'],
'litpic' => $row['litpic'],
'pubdate' => $row['pubdate'],
'click' => $row['click']
];
}
// 输出JSON并终止脚本执行,不再执行下面的HTML模板
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['data' => $articles], JSON_UNESCAPED_UNICODE);
exit;
}
?>
步骤 3:调用API
访问列表页,并添加 format=json 参数。
示例URL:
http://你的域名/plus/list.php?tid=1&format=json
缺点:
- 破坏性:修改了模板文件,使其不再是纯HTML。
- 不灵活:只能基于现有的列表页进行改造,无法创建独立的API接口。
- 升级风险:每次升级DedeCMS,都可能需要重新修改这个文件。
重要注意事项
-
安全性:
- SQL注入:在示例中,我们使用了
(int)来强制转换ID,这可以防止大部分数字类型的SQL注入,对于字符串类型的参数,必须使用$dsql->ReplaceQuote()或预编译语句进行过滤。 - 权限控制:如果你的API是给第三方或App使用的,请务必增加API密钥或Token验证机制,可以在请求头或URL参数中加入一个密钥,在PHP文件中进行验证。
- 文件权限:确保你的
api文件夹有正确的执行权限,但不要有写入权限,以防上传恶意文件。
- SQL注入:在示例中,我们使用了
-
性能:
每次API请求都会连接数据库并执行查询,对于高并发请求,可以考虑使用缓存(如Redis、Memcached)来缓存API结果,减轻数据库压力。
-
编码:
- 始终在
header()和json_encode()中明确指定charset=utf-8,并使用JSON_UNESCAPED_UNICODE选项,这是处理中文数据最稳妥的方式。
- 始终在
-
分页:
- 如果数据量很大,你需要实现分页功能,可以通过传递
page和pagesize参数,然后在SQL中使用LIMIT (page-1)*pagesize, pagesize来实现。
- 如果数据量很大,你需要实现分页功能,可以通过传递
对于任何新的开发项目,强烈推荐使用方法一,即创建独立的API文件,它更安全、更灵活、更易于维护,是现代Web应用开发的最佳实践,方法二只适用于一些快速、临时的需求。
