API,全称Application Programming Interface(应用程序编程接口),可简单理解为一种功能接口。通常,人们容易将API与大公司提供的特色服务(如地图、天气数据等)联系起来。
然而,在很多中小型项目中,为实现前后端分离的开发架构,同样需要搭建轻量级的后端服务,此时API便扮演了至关重要的角色。
这个项目能干什么?
本文开源了一种轻量级的问卷系统后端实现方案,部署后您的前端可以通过索引、随机、列表向后端服务器请求选择题的题目、四个选项、正确答案和解析文字。(请求规范见下)
需要特别说明的是,该实现较为简单,并未包含完善的 API 鉴权(可以自己加一个简单的token验证)、数据库(用的本地json存储数据)等机制,因此不建议直接用于生产环境。(但是个人小项目,测试环境应急一下也是完全ok的)
如何使用?
1,将config.php api.php(这两个文件在文章底部)添加到已经部署好环境(PHP和Nginx)的服务器中
2,访问yoursite.com/api.php,确保questions.json被创建
3,在questions.json编辑你的问题,注意json的语法不要错:
[
{
"id": 1,
"question": "这是第一个问题",
"options": ["选项A", "选项B", "选项C", "选项D"],
"correct_index": 0,//注释:列表的索引是从零开始的,即0为A选项
"analysis": "解析内容"
},
{
"id": 2,
"question": "第二个问题",
"options": ["选项A", "选项B", "选项C", "选项D"],
"correct_index": 0,
"analysis": "解析内容"
}
]
4,开始愉快的请求吧!
请求方式都是GET
访问yoursite.com/api.php?action=get&id=1 获得id为1的题目
访问yoursite.com/api.php?action 获得随机一道题目,可能有重复
访问yoursite.com/api.php?action=list 获得全部题目
完整代码
gitee传不上去,已经累了,直接贴在这里了:
config.php
<?php
// config.php – 配置文件
define(‘DATA_FILE’, ‘questions.json’);//创建questions.json文件
header(‘Content-Type: application/json; charset=utf-8’);//HTTP响应头,标识数据是JSON格式的,并且使用UTF-8编码
// 允许跨域请求
header(‘Access-Control-Allow-Origin: *’);//允许任何网站访问
header(‘Access-Control-Allow-Methods: GET, POST, DELETE’);//允许使用GET, POST, DELETE这三种HTTP请求方法。
header(‘Access-Control-Allow-Headers: Content-Type’);//允许请求中携带Content-Type这个头信息
// 加载题目数据函数
function loadQuestions() {
if (!file_exists(DATA_FILE)) {
// 如果文件不存在,创建初始文件
$initialData = [];
file_put_contents(DATA_FILE, json_encode($initialData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
return $initialData;
}
$data = file_get_contents(DATA_FILE);
if ($data === false) {
// 如果无法读取文件,返回空数组
return [];
}
$questions = json_decode($data, true);
// 检查JSON解码是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
// 如果JSON格式错误,返回空数组
return [];
}
return is_array($questions) ? $questions : [];
}
// 保存题目数据函数
function saveQuestions($questions) {
if (!is_array($questions)) {
$questions = [];
}
$result = file_put_contents(DATA_FILE, json_encode($questions, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
return $result !== false;
}
?>
api.php
<?php
// api.php – API接口界面
require_once ‘config.php’;//必须有这个文件,否则无法进行
// 设置更详细的错误报告(开发环境)
error_reporting(E_ALL);//报告所有类型的错误、警告和提示
ini_set(‘display_errors’, 1);//错误直接显示
// 处理预检请求(CORS)如果有浏览器预检查,回复200
if ($_SERVER[‘REQUEST_METHOD’] == ‘OPTIONS’) {
http_response_code(200);
exit();
}
//从URL参数中获取一个名为 action的值。
$action = $_GET[‘action’] ?? ”;
// 记录请求日志(调试用)将当前的时间和接收到的 $action记录到一个日志文件里
file_put_contents(‘api_log.txt’, date(‘Y-m-d H:i:s’) . ” – Action: $action\n”, FILE_APPEND);
//根据收到的指令调用不同的功能函数
switch ($action) {
case ‘get’:
$id = $_GET[‘id’] ?? ”;//如果是’get’,获取URL中的 id参数,然后调用 getQuestion函数获取特定问题。
getQuestion($id);
break;
case ‘random’://如果是’random’,调用getRandomQuestion函数获取一个随机问题。
getRandomQuestion();
break;
case ‘list’://如果是’list’调用 listQuestions函数获取问题列表。
listQuestions();
break;
default:
echo json_encode([‘error’ => ‘无效的操作’, ‘available_actions’ => [‘get’, ‘random’, ‘list’]]);//如果指令不匹配任何选项,返回一个JSON格式的错误信息,并提示可用的操作。
break;
}
// 根据ID获取题目
//检查参数:判断传入的 $id是否不是数字 (!is_numeric($id)) 或者小于1 ($id < 1)就返回报错
function getQuestion($id) {
if (!is_numeric($id) || $id < 1) {
echo json_encode([‘error’ => ‘无效的题目ID’]);
return;
}
//调用另一个函数 loadQuestions()来从questions.json中加载所有题目的数据。
$questions = loadQuestions();
// 确保$questions是数组
if (!is_array($questions)) {
echo json_encode([‘error’ => ‘题目数据格式错误’]);
return;
}
foreach ($questions as $question) {//使用 foreach在所有题目 ($questions) 中逐个查找
if (isset($question[‘id’]) && $question[‘id’] == $id) {//检查当前题目的 id字段是否存在,并且是否等于要查找的 $id
echo json_encode($question);//一旦找到匹配的题目,立即将其转换为JSON格式输出,并用 return结束函数
return;
}
}
echo json_encode([‘error’ => ‘题目不存在’, ‘id’ => $id]);
}
// 获取随机题目
function getRandomQuestion() {
$questions = loadQuestions();//从文件中读取所有题目数据
// 确保$questions是数组
if (!is_array($questions)) {
echo json_encode([‘error’ => ‘题目数据格式错误’]);
return;
}
//确保题目非空
if (empty($questions)) {
echo json_encode([‘error’ => ‘暂无题目’]);
return;
}
//返回随机题目
$randomIndex = array_rand($questions);
echo json_encode($questions[$randomIndex]);
}
// 列出所有题目(用于调试)
function listQuestions() {
$questions = loadQuestions();
// 确保$questions是数组
if (!is_array($questions)) {
echo json_encode([‘error’ => ‘题目数据格式错误’]);
return;
}
echo json_encode($questions);
}
?>
发表回复