Quickstarters
Feature Overview
如何为Golang构建后端?
31 分
介绍 在本教程中,您将学习如何使用 back4app 构建和测试完整的 golang 后端。 我们将引导您集成 back4app 的基本功能——如数据库管理、安全设置、用户身份验证、文件存储和云代码——以创建一个安全、灵活且可扩展的后端,能够与您的 go http 服务器良好配合。 我们的重点将放在使用 back4app 的 restful api 从我们的 golang http 客户端连接到数据库,而不是使用专用的 parse sdk,以便我们可以说明如何为您的新后端构建易于维护的处理函数。 您将看到这种方法相比从头开始设置自己的服务器降低了开发复杂性。 通过依赖 back4app 的实时查询、文件存储和用户身份验证系统,您将加快后端创建过程。 到最后,您将知道如何构建一个安全的 golang 后端,安排自动化任务,并集成外部 webhook。 您将为将此基础增强为生产就绪的应用程序或根据需要添加自定义逻辑做好充分准备。 先决条件 一个 back4app 账户 免费注册 在这里 https //www back4app com/ 。 一个新的 back4app 项目 开始使用 back4app https //www back4app com/docs/get started/new parse app go (golang) 开发环境 确保您的机器上已安装 go。您可以在 go 官方文档 https //go dev/ 中找到说明。 对 go 的 http 包和 restful api 的基本知识 熟悉如何编写 func 处理程序、解析错误消息、处理方法 post 请求以及设置 http 本地主机服务器将有所帮助。 在继续之前,请确保您具备这些先决条件。此设置将简化您的体验,让您了解如何使用 back4app 为 golang 构建后端。 步骤 1 – 在 back4app 上创建新项目并连接 为什么要创建新项目? 创建一个新的 back4app 项目是您的第一步。您将在这里存储数据、配置文件存储、调度云函数并添加后台任务。这个后端项目将支撑所有后续步骤。 登录到您的 back4app 账户 点击 “新应用” 在您的 back4app 控制面板中 命名您的应用 (例如,“golang backend tutorial”)。 创建后,它将出现在您的控制面板中。这个应用程序现在是您基于 back4app 的后端 通过 rest api 连接 back4app 提供 restful api 来创建、更新和删除数据。在 golang 中,我们将使用 go 标准库中的 http 客户端与这些端点进行通信 找到您的 应用程序 id 和 rest api 密钥 ,方法是前往您的 back4app 应用的 设置 或 安全与密钥 部分 您需要在每个请求头中包含这些凭据。我们将在下一步中通过使用post、get和其他http请求连接到数据库时说明这一点。 步骤 2 – 设置数据库 创建数据模型 要在back4app中存储数据,您需要定义类(表)和列(字段)。例如,假设我们想要一个 todo 类。您可以在back4app仪表板中手动创建它: 转到您应用程序仪表板中的 数据库 部分。 创建一个名为“todo”的新类。 添加诸如标题(字符串)和iscompleted(布尔值)等列。 您还可以通过从您的golang应用程序发送带有新字段的对象来让系统自动创建列。 使用ai代理创建数据模型 在您的应用仪表板中打开 ai代理。 描述您期望的数据模型 (例如,“请创建一个新的todo类,包含标题字段和iscompleted字段。”)。 接受 建议的架构。 这个方便的功能可以节省设计数据库架构的时间。 使用 rest api 读取和写入数据(golang 示例) 以下是一个基本示例,演示如何使用 go 的 http 包创建(post 方法)和获取(get 方法)数据。假设您将您的 application id 和 rest api key 设置为环境变量。 package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "log" "net/http" ) type todo struct { objectid string `json "objectid,omitempty"` title string `json "title,omitempty"` iscompleted bool `json "iscompleted,omitempty"` } func main() { // example create todo newtodo = todo{ title "buy groceries", iscompleted false, } created, err = createtodo(newtodo) if err != nil { log println("error creating todo ", err) } else { log println("created todo with id ", created objectid) } // example fetch todos todos, err = fetchalltodos() if err != nil { log println("error fetching todos ", err) } else { for , t = range todos { log println("fetched todo ", t title, t iscompleted) } } } // createtodo sends a post request to save a new record in the "todo" class func createtodo(todo todo) (todo, error) { // convert struct to json body, = json marshal(todo) // create http request req, err = http newrequest("post", "https //parseapi back4app com/classes/todo", bytes newbuffer(body)) if err != nil { return todo{}, err } // set necessary headers req header set("x parse application id", "your application id") req header set("x parse rest api key", "your rest api key") req header set("content type", "application/json") // execute the request client = \&http client{} resp, err = client do(req) if err != nil { return todo{}, err } defer resp body close() if resp statuscode != http statuscreated && resp statuscode != http statusok { bodybytes, = ioutil readall(resp body) return todo{}, fmt errorf("api error %s", string(bodybytes)) } // parse response var createdtodo todo if err = json newdecoder(resp body) decode(\&createdtodo); err != nil { return todo{}, err } return createdtodo, nil } // fetchalltodos retrieves all todo objects from back4app using get func fetchalltodos() (\[]todo, error) { req, err = http newrequest("get", "https //parseapi back4app com/classes/todo", nil) if err != nil { return nil, err } req header set("x parse application id", "your application id") req header set("x parse rest api key", "your rest api key") client = \&http client{} resp, err = client do(req) if err != nil { return nil, err } defer resp body close() if resp statuscode != http statusok { bodybytes, = ioutil readall(resp body) return nil, fmt errorf("api error %s", string(bodybytes)) } // parse response for "results" key var result struct { results \[]todo `json "results"` } if err = json newdecoder(resp body) decode(\&result); err != nil { return nil, err } return result results, nil } 在这些示例中,我们创建一个http客户端,添加必要的头信息,并处理响应代码和错误消息。请记得替换 your application id 和 your rest api key 为您back4app项目中的实际密钥。 使用graphql api读取和写入数据 back4app还提供了一个graphql端点,地址为 https //parseapi back4app com/graphql 您可以使用流行的go graphql客户端库(如 machine box graphql https //github com/machinebox/graphql ) 来执行查询或变更。这比原始rest调用更具结构化。 使用实时查询(可选) 如果您希望在应用中看到实时更新,可以在back4app仪表板中启用实时查询。golang没有官方的parse实时查询库。然而,您可以实现自己的websocket连接,以监听来自 wss\ //your subdomain b4a io 的实时查询更新。此功能对于需要立即数据同步的协作应用非常有用。 步骤3 – 使用acl和clp应用安全性 概述 back4app 提供访问控制列表 (acls) 和类级权限 (clps) 来保护您的数据。acls 在每个对象上定义,而 clps 定义整个类的总体规则。 类级权限 转到您应用的 数据库 视图在 back4app 中。 选择一个类 (例如, 待办事项 )。 点击 类级权限 并为不同用户角色或公共访问设置读/写权限。 acls 您可以在通过 rest 调用创建或更新对象时传递 acl。这确保只有某些用户或角色可以读/写数据。有关更多详细信息,请访问 应用安全指南 https //www back4app com/docs/security/parse security 。 步骤 4 – 编写云代码函数 为什么使用云代码 云代码允许您运行服务器端函数、触发器或验证—无需管理自己的服务器。您可以添加高级业务逻辑或从服务器端集成外部 api。 示例云函数 一个简单的示例是一个计算文本长度的函数。在您的 main js 文件中,在 back4app 仪表板上 parse cloud define('calculatetextlength', async (request) => { const { text } = request params; if (!text) { throw new error('no text provided'); } return { length text length }; }); 部署 通过以下方式部署云代码 back4app cli back4app dashboard 在 cloud code > functions 将您的代码粘贴到 main js 编辑器中,然后点击 部署 从 golang 调用云函数 您可以通过 http 客户端通过 rest 调用云函数 func callcalculatetextlength(txt string) (int, error) { body, = json marshal(map\[string]string{"text" txt}) req, err = http newrequest("post", "https //parseapi back4app com/functions/calculatetextlength", bytes newbuffer(body)) if err != nil { return 0, err } // headers req header set("x parse application id", "your application id") req header set("x parse rest api key", "your rest api key") req header set("content type", "application/json") client = \&http client{} resp, err = client do(req) if err != nil { return 0, err } defer resp body close() if resp statuscode != http statusok { bodybytes, = ioutil readall(resp body) return 0, fmt errorf("api error %s", string(bodybytes)) } var result struct { result map\[string]int `json "result"` } if err = json newdecoder(resp body) decode(\&result); err != nil { return 0, err } return result result\["length"], nil } 步骤 5 – 配置身份验证 启用用户身份验证 back4app 使用一个 用户 类进行身份验证。当您通过 rest 创建新用户时,后端将安全地存储凭据并生成会话令牌。 curl x post \\ h "x parse application id your app id" \\ h "x parse rest api key your rest api key" \\ h "content type application/json" \\ d '{"username" "alice", "password" "secret123", "email" "alice\@example com"}' \\ https //parseapi back4app com/users 使用返回的会话令牌进行后续需要用户权限的请求。在 go 中,您可以像之前演示的那样,从 http 客户端发送相同类型的 http 请求。 社交登录 对于 google 或 facebook 等社交登录,您需要在 back4app 上配置 oauth 设置。这些流程通常涉及交换令牌。请查阅 使用 apple 登录 / 社交登录文档 https //www back4app com/docs/platform/sign in with apple 以获取详细信息。 步骤 6 – 处理文件存储 设置和上传 您可以通过将文件作为 base64 编码数据或 multipart/form data 发送到 back4app 来存储文件 curl x post \\ h "x parse application id your app id" \\ h "x parse rest api key your rest api key" \\ h "content type application/json" \\ d '{ "file" { "name" "myimage png", " type" "file", "base64" "ivborw0kggoaaaansuheugaa " } }' \\ https //parseapi back4app com/files/myimage png 上传后,您可以通过存储返回的文件 url 或文件指针将文件附加到对象。在 go 中,以相同的方式创建 http 请求——只需确保正确编码文件内容。 步骤 7 – 邮件验证和密码重置 重要性 邮件验证确保用户控制所提供的电子邮件,而密码重置帮助他们恢复账户。这两个功能增强了安全性和信任。 启用邮件验证 前往您的 back4app 控制面板 在 电子邮件设置 , 启用验证邮件 如有需要,自定义您的电子邮件模板。 当用户注册时,系统会自动向他们发送验证邮件。 密码重置 使用 requestpasswordreset rest 端点 https //docs parseplatform org/rest/guide/#r passwordreset 来启动密码重置 curl x post \\ h "x parse application id your app id" \\ h "x parse rest api key your rest api key" \\ h "content type application/json" \\ d '{"email" "alice\@example com"}' \\ https //parseapi back4app com/requestpasswordreset 步骤 8 – 使用云作业调度任务 云作业的作用 云作业按计划运行,以自动化任务,例如清理过期数据或发送每周通讯。 parse cloud job('cleanupoldtodos', async (request) => { const todo = parse object extend('todo'); const query = new parse query(todo); // remove records older than 30 days // }); 部署此作业并在您的 back4app 控制面板 > 应用设置 > 服务器设置 > 后台作业 中调度它。 步骤 9 – 集成 webhooks 为什么使用 webhooks webhooks 允许您在某些事件发生时通知外部服务。例如,当创建新的 todo 项时,您可能会发送 slack 警报。 转到 webhooks 部分在您的 back4app 控制面板中。 配置您的端点 (例如 https //your external service com/webhook )。 分配触发器 (例如,在 todo ) 上使用 aftersave。 如果您希望直接控制事件,您还可以通过编写 http 客户端请求从云代码触发外部 api。 步骤 10 – 探索 back4app 管理面板 概述 back4app 管理应用是一个点选界面,您可以与非技术团队成员共享,以管理数据。 启用管理应用 前往 更多 > 管理应用 在您的 back4app 控制面板中。 启用 它并创建一个管理员用户。 使用您选择的子域名登录到一个简单的用户界面进行数据操作。这使您无需编写直接查询或自定义代码来执行基本操作。 结论 在本指南中,您了解了如何使用 back4app 为 golang 构建后端。 您探索了如何通过 restful api 连接到数据库,使用 acl 和 clp 应用安全措施,使用云作业运行计划任务,使用 webhooks 集成外部服务,以及设置用户身份验证和文件存储。 借助 go 的 http 包和 back4app 的强大功能,您可以构建一个强大的后端,节省时间并轻松扩展。 现在您已经掌握了基础知识,您可以扩展您的 golang 处理程序函数逻辑,连接到新的 api 端点,并构建一个满足您需求的丰富应用。 后续步骤 优化您的 golang 应用 添加基于角色的访问等高级功能,或优化您的 http 服务器以用于生产。 了解更多关于实时查询的信息 集成实时查询以用于协作应用。 探索高级 back4app 文档 微调您的 acl、日志和分析。 整合第三方 api 使用云代码或直接 webhooks 扩展您的后端功能。