织梦dedecms如何开启json api接口?

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 织梦建站 正文
  1. 推荐方法:通过创建自定义PHP文件(更灵活、更安全)
  2. 辅助方法:修改DedeCMS核心文件(更直接,但有风险)

创建自定义PHP文件(推荐)

这是最推荐的方法,因为它不修改织梦的核心文件,升级DedeCMS时不会丢失你的API代码,并且可以更好地控制权限和逻辑。

织梦dedecms json 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。

织梦dedecms json 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

缺点:

  1. 破坏性:修改了模板文件,使其不再是纯HTML。
  2. 不灵活:只能基于现有的列表页进行改造,无法创建独立的API接口。
  3. 升级风险:每次升级DedeCMS,都可能需要重新修改这个文件。

重要注意事项

  1. 安全性

    • SQL注入:在示例中,我们使用了 (int) 来强制转换ID,这可以防止大部分数字类型的SQL注入,对于字符串类型的参数,必须使用 $dsql->ReplaceQuote() 或预编译语句进行过滤。
    • 权限控制:如果你的API是给第三方或App使用的,请务必增加API密钥或Token验证机制,可以在请求头或URL参数中加入一个密钥,在PHP文件中进行验证。
    • 文件权限:确保你的 api 文件夹有正确的执行权限,但不要有写入权限,以防上传恶意文件。
  2. 性能

    每次API请求都会连接数据库并执行查询,对于高并发请求,可以考虑使用缓存(如Redis、Memcached)来缓存API结果,减轻数据库压力。

  3. 编码

    • 始终在 header()json_encode() 中明确指定 charset=utf-8,并使用 JSON_UNESCAPED_UNICODE 选项,这是处理中文数据最稳妥的方式。
  4. 分页

    • 如果数据量很大,你需要实现分页功能,可以通过传递 pagepagesize 参数,然后在SQL中使用 LIMIT (page-1)*pagesize, pagesize 来实现。

对于任何新的开发项目,强烈推荐使用方法一,即创建独立的API文件,它更安全、更灵活、更易于维护,是现代Web应用开发的最佳实践,方法二只适用于一些快速、临时的需求。

-- 展开阅读全文 --
头像
dede field.keywords是什么?如何使用?
« 上一篇 12-07
织梦标签 span>
下一篇 » 12-07

相关文章

取消
微信二维码
支付宝二维码

目录[+]