一个简单问卷api后端开源

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);

}

?>


已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注