核心概念解析
在开始之前,我们需要明确几个关键点:

(图片来源网络,侵删)
- 万网织梦网站:这是一个基于PHP和MySQL的建站系统,它的内容(文章、产品、图片等)都存储在网站的数据库里。
- APP:这里我们主要指原生APP(iOS/Android)或混合APP(如使用React Native, Flutter, uni-app等开发),APP是用户直接交互的客户端。
- API接口:这是连接网站和APP的“桥梁”,网站需要开放一些接口,允许APP通过HTTP请求来获取或提交数据。“获取最新10篇文章列表”、“获取文章详情”、“提交用户留言”等。
为什么不能让APP直接访问网站?
- 数据安全:直接暴露数据库信息给APP,极易被攻击,导致数据泄露。
- 协议不匹配:网站通常使用HTTP/HTTPS协议,而APP内部通信更倾向于使用轻量级的JSON格式数据。
- 性能与体验:直接解析网页HTML在APP中非常困难且效率低下,无法提供原生流畅的体验。
实现步骤详解
整个过程可以分为三个主要阶段:
准备工作
-
确认网站环境:
- 确保你的万网织梦网站可以正常访问。
- 确保你有服务器的管理权限(如FTP/SFTP、服务器后台),以便后续修改文件。
- 确保你的PHP环境支持
cURL或file_get_contents等函数,这是发起HTTP请求的基础。
-
选择APP开发方式:
(图片来源网络,侵删)- 原生开发:使用Android的Java/Kotlin或iOS的Swift/Objective-C,优点是性能最好,体验最流畅;缺点是开发成本高,需要维护两套代码。
- 混合开发:使用
uni-app、React Native、Flutter等框架,优点是“一套代码,多端运行”(iOS/Android/小程序等),开发效率高;缺点是性能相比原生稍差,但对于大多数内容展示类网站完全足够。 - 小程序/H5:如果你的需求是“类APP”体验,可以考虑直接开发微信小程序或H5页面,小程序的API调用方式与APP类似。
-
准备APP开发工具:
根据你选择的开发方式,安装相应的开发环境,如Android Studio、Xcode、HBuilderX等。
为网站创建API接口
这是最关键的一步,我们需要在织梦网站的后端创建PHP文件,这些文件负责从数据库中取出数据,并以JSON格式返回给APP。
示例:创建一个获取文章列表的API

(图片来源网络,侵删)
假设我们要获取网站首页的文章列表。
-
找到并分析织梦的数据查询代码:
- 登录你的网站后台,找到首页模板文件(通常路径是
/templets/default/index.html)。 - 复制其中用于调用文章列表的PHP代码,它看起来可能像这样:
{dede:arclist titlelen='40' row='10'} <li> <a href='[field:arcurl/]'>[field:title/]</a> <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> </li> {/dede:arclist} - 这里的
{dede:arclist...}是织梦的标签,底层会执行相应的SQL查询。
- 登录你的网站后台,找到首页模板文件(通常路径是
-
创建API文件:
- 在你的网站根目录下,创建一个新的文件夹,
api。 - 在
api文件夹里,创建一个新的PHP文件,get_articles.php。
- 在你的网站根目录下,创建一个新的文件夹,
-
编写API逻辑:
- 打开
get_articles.php,编写PHP代码来获取数据并返回JSON。
<?php // 设置响应头,告诉客户端返回的是JSON格式 header('Content-Type: application/json; charset=utf-8'); // 1. 引入织梦的核心文件,以便使用其数据库连接和函数 // 注意:这里的路径需要根据你的网站结构调整 require_once (dirname(__FILE__) . "/include/common.inc.php"); // 2. 准备要返回的数据数组 $articles = array(); // 3. 执行数据库查询,获取文章列表 // 这里我们直接使用织梦的底层SQL查询函数,更灵活 // 查询10篇最新发布的文章 $sql = "SELECT id, title, arcurl, pubdate FROM dede_archives WHERE channel = 1 ORDER BY pubdate DESC LIMIT 10"; $dsql->SetQuery($sql); $dsql->Execute(); // 4. 遍历查询结果,并格式化数据 while ($row = $dsql->GetArray()) { // 对日期进行格式化,方便APP端使用 $formatted_date = date('Y-m-d H:i:s', $row['pubdate']); // 将每篇文章的数据存入数组 $articles[] = array( 'id' => $row['id'], 'title' => $row['title'], 'url' => $row['arcurl'], // 文章在网站上的链接 'publish_time' => $formatted_date ); } // 5. 将PHP数组转换为JSON字符串并输出 // JSON_UNESCAPED_UNICODE 确保中文字符不被转义 echo json_encode($articles, JSON_UNESCAPED_UNICODE); ?> - 打开
-
测试API:
- 在浏览器中访问
http://你的域名/api/get_articles.php。 - 如果一切正常,你应该能看到类似下面这样的JSON数据:
[ { "id": "123", "title": "欢迎使用万网织梦", "url": "/a/2025/123.html", "publish_time": "2025-10-27 10:00:00" }, { "id": "122", "title": "APP接入教程", "url": "/a/2025/122.html", "publish_time": "2025-10-26 15:30:00" } ]
- 在浏览器中访问
其他API示例:
- 获取文章详情 (
get_article_detail.php): 接收一个文章ID参数,查询dede_archives和dede_addonarticle(如果使用了文章模型)表,返回文章标题、内容、图片等。 - 获取分类列表 (
get_categories.php): 查询dede_arctype表,返回所有栏目分类。
APP端调用API并展示数据
我们以 uni-app 为例,说明如何在APP中调用上面创建的API。
-
发起网络请求: uni-app提供了
uni.request()API来发起网络请求。// 在页面的 onLoad 函数中调用 onLoad() { this.fetchArticles(); }, methods: { fetchArticles() { uni.request({ // 替换成你的API地址 url: 'http://你的域名/api/get_articles.php', method: 'GET', success: (res) => { // 请求成功,res.data 就是服务器返回的JSON数据 if (res.statusCode === 200) { console.log('获取文章成功:', res.data); this.articleList = res.data; // 将数据赋值给页面变量 } else { console.error('服务器返回错误:', res.statusCode); uni.showToast({ title: '获取数据失败', icon: 'none' }); } }, fail: (err) => { // 请求失败,可能是网络问题或服务器宕机 console.error('网络请求失败:', err); uni.showToast({ title: '网络连接失败', icon: 'none' }); } }); } } -
在页面中展示数据: 在页面的
.vue文件中,使用v-for指令循环渲染数据。<template> <view class="container"> <view class="article-item" v-for="item in articleList" :key="item.id" @click="goToDetail(item.url)"> <text class="title">{{ item.title }}</text> <text class="date">{{ item.publish_time }}</text> </view> </view> </template> <script> export default { data() { return { articleList: [] // 用于存储从API获取的文章列表 } }, onLoad() { this.fetchArticles(); }, methods: { fetchArticles() { // ... 上面的 uni.request 代码放在这里 ... }, goToDetail(url) { // 点击文章后,可以跳转到H5页面或使用web-view组件加载文章 uni.navigateTo({ url: '/pages/webview/webview?url=' + encodeURIComponent(url) }); } } } </script> <style> .article-item { padding: 20rpx; border-bottom: 1px solid #eee; }{ font-size: 32rpx; font-weight: bold; display: block; margin-bottom: 10rpx; } .date { font-size: 24rpx; color: #999; } </style>
重要注意事项
-
跨域问题:
- 当你的APP(
http://app.example.com)请求网站(http://web.example.com)的API时,会触发浏览器的同源策略,导致请求失败。 - 解决方案:在你的网站服务器上配置CORS(跨域资源共享)。
- Apache服务器:在
.htaccess文件中添加:Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type"
- Nginx服务器:在
nginx.conf中添加:add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
- Apache服务器:在
- 当你的APP(
-
API安全:
- 不要直接暴露核心SQL:上面的例子是为了教学,直接写SQL有注入风险,最好使用织梦自带的查询函数,并对用户输入进行过滤。
- 增加身份验证:为了防止API被恶意调用,你应该增加一个简单的验证机制,在请求时附带一个
token参数,这个token是你在APP端和服务器端约定好的一个密钥,API文件在处理请求时,先验证token是否正确。 - API版本控制:当你的API需要升级时,可以设计成
api/v1/get_articles.php和api/v2/get_articles.php,这样不会影响旧版本的APP。
-
性能优化:
- 数据缓存:对于不经常变动的数据(如文章列表),可以在APP端进行缓存,避免每次都请求服务器。
- 分页加载:不要一次性请求所有数据,采用“下拉加载更多”或“上拉刷新”的分页模式,减少服务器压力和APP的流量消耗。
将万网织梦网站接入APP,是一个典型的“前后端分离”思想的实践。
总流程:
网站端(后端):修改PHP代码,创建能返回JSON的API接口。
APP端(前端):使用网络请求库(如uni.request)调用API,获取JSON数据,并用UI组件展示出来。
这个过程对于有一定开发基础的人来说是完全可行的,如果你对编程不熟悉,可以考虑寻找专业的开发者或外包团队来完成这项工作。
