使用Strapi进行自定义API开发:创建自定义端点 ...
Strapi 是一款功能强大的无头 CMS,不仅可以帮助您管理内容,还支持创建自定义 API 端点。这些端点可以根据需求进行定制,以便为前端应用程序提供所需的数据,并允许您定义自己的路由和逻辑。在本指南中,我们将详细介绍如何在 Strapi 中生成和使用自定义 API 端点。
为什么需要自定义 API 端点?
虽然 Strapi 为内容类型提供了一组内置的 API 端点,但在某些情况下,您可能需要更高的控制或特定的数据输出。这时,自定义 API 端点就显得尤为重要。以下是它的一些主要用途:
- 数据转换:根据前端需求,自定义 API 返回的数据结构。
- 第三方集成:连接外部 API 和服务,处理数据并提供给前端。
- 优化查询:为复杂的数据检索创建高效的定制查询。
在开始之前,请确保您已安装 Strapi,并且项目已启动运行。如果尚未设置 Strapi,可以参考相关入门教程。
创建自定义 API 端点
在本示例中,我们将创建一个名为 GET /api/get-articles 的自定义 API 端点,该端点将返回 article 集合类型的简化列表。
1. 生成 API 结构
首先,使用以下命令生成 API 结构:
npx strapi generate
如果您使用的是 Yarn,也可以运行:
yarn strapi generate
在 CLI 提供的选项中选择 “api – 生成基本 API”,将 API 命名为 get-articles,并确认该 API 不适用于插件。此命令会在项目的 src/api 文件夹中生成一个名为 get-articles 的新目录,其中包含以下三个子目录:
- controllers:用于定义 API 操作的逻辑,处理请求并返回响应。
- routes:定义 API 端点及其关联的控制器操作。
- services:封装业务逻辑的可重用功能。
2. 配置路由
在 Strapi 中,路由定义了 API 如何响应传入的请求。打开 src/api/get-articles/routes 文件夹中的 get-articles.js 文件,并根据需求设置路由。
3. 编写控制器逻辑
控制器负责处理客户端请求并调用服务函数来执行业务逻辑。打开 src/api/get-articles/controllers 文件夹中的 get-articles.js 文件,并将内容替换为以下代码:
'use strict';
/**
* A set of functions called "actions" for get-articles
*/module.exports = {
getArticles: async (ctx, next) => {
try {
const data = await strapi
.service("api::get-articles.get-articles")
.getArticles();
console.log("Data", data);
ctx.body = data;
} catch (err) {
ctx.badRequest("Get articles controller error", { moreDetails: err });
}
}
};
4. 编写服务逻辑
服务包含实际的业务逻辑,是可重用的功能模块。打开 src/api/get-articles/services 文件夹中的 get-articles.js 文件,并将内容替换为以下代码:
// Return the reduced data
return entriesReduced;
} catch (err) {
return err;
}
},
};
/**
* get-articles service
*/
module.exports = {
getArticles: async () => {
try {
// Fetching data
const entries = await strapi.entityService.findMany(
"api::article.article",
{
fields: ["id", "Title", "Content", "createdAt"],
populate: {
Author: {
fields: ["username", "email"],
},
Category: {
fields: ["name"],
},
},
}
);
// Reduce the data to the format we want to return
let entriesReduced;
if (entries && Array.isArray(entries)) {
entriesReduced = entries.reduce((acc, item) => {
acc = acc || [];
acc.push({
id: item?.id,
title: item.Title || "",
category: item.Category.name || "",
publishedDate: new Date(item.createdAt).toDateString() || "",
authorName: item.Author?.username || "",
authorEmail: item.Author?.email || "",
content: item.Content || ""
});
return acc;
}, []);
}
// Return the reduced data
return entriesReduced;
} catch (err) {
return err;
}
},
};
配置 API 的访问权限
默认情况下,自定义 API 端点可能无法被公开访问。您需要在 Strapi 仪表盘中设置相应的权限:
- 进入 “设置” > “角色” > “Authenticated”。
- 如果需要公开访问,则进入 “设置” > “角色” > “Public”。
- 在
get-articles路由权限中,选择所需的访问权限。
注意:确保为 Article、Category 和 Users-Permissions(用户)正确配置访问权限,否则可能无法获取所有字段的数据。
通过以上步骤,您已经成功创建了一个自定义 API 端点,并能够根据需求返回简化的文章列表。希望本指南对您有所帮助!
原文链接: https://sachini-dissanayaka.medium.com/custom-api-development-with-strapi-creating-custom-endpoints-for-your-frontend-applications-573ff762b918