Skip to main content
本页记录的是 github.com/squarecloudofc/sdk-api-go/v3(v3.0.0),这是 SDK 的一次重写。正从 v2 升级?请阅读 v2 → v3 迁移指南。

要求

该模块除 Go 标准库外没有任何依赖,并以 MIT 许可证发布(v2 为 AGPL-3.0)。其包名为 squarecloud。

安装

API 密钥与作用域

在 squarecloud.app/account/security 创建密钥。SDK 会将其原样放入 Authorization 请求头发送(不带 Bearer 前缀)。 密钥可以限制为特定的作用域(apps:read、apps:deploy、apps:control、ai:chat……)以及特定的应用或数据库:
  • 超出这些限制的调用会返回 *APIError,状态为 403,代码为 MISSING_SCOPE 或 RESOURCE_NOT_ALLOWED。
  • 列表方法(Account.Me、Apps.StatusAll……)只返回该密钥可见的资源。
  • 未知、已撤销或已过期的密钥会返回 401 ACCESS_DENIED。
不要将密钥写入源代码,也不要将其放入你分发的二进制文件中。请从环境变量或密钥存储中读取它。
示例从环境变量 SQUARECLOUD_API_KEY 读取密钥。请在运行示例的终端中设置它:

创建客户端

将它保存为模块中的 main.go(先运行 go mod init example.com/hello,再运行上面的 go get),然后运行 go run .。它会打印你的账户名称,以及该密钥可以看到的应用数量:
squarecloud.New(apiKey, opts...) 返回一个 *Client,并且从不返回错误。*Client 可以安全地并发使用:只需构建一次,然后在各个 goroutine 之间共享。 由于 New 不会失败,空密钥或仅含空白字符的密钥不会在此处被拒绝。相反,除 Service.Status 外的每个调用都会在发送任何请求之前于本地以 INVALID_API_KEY(状态 0)失败。该代码仅存在于 Go SDK 中。

选项

在密钥之后将选项传给 New:
不要在传给 WithHTTPClient 的 *http.Client 上设置 Timeout。该超时也覆盖读取响应体的过程,因此会切断实时流和 snapshot 下载。请改用 context、WithTimeout 以及 http.Transport 的超时。
SDK 从不输出日志。要追踪请求,请包装传给 WithHTTPClient 的客户端的 http.RoundTripper。
API 密钥存储在客户端的一个未导出字段中。fmt 会打印未导出字段,因此不要使用 %v 或 %+v 打印客户端。

运行示例

Go SDK 各页面中的代码片段都是片段。每个片段都可以在这个程序中单独运行,该程序声明了片段所用的 ctx、c 和 appID:
每次只粘贴一个片段到 main 中,然后运行 goimports -w . 来添加它所需的导入(fmt、log、time……)。使用 go install golang.org/x/tools/cmd/goimports@latest 安装它,或者让编辑器的 Go 扩展(gopls)在保存时添加导入。需要其他 ID(例如数据库或 workspace 的 ID)的页面,会以它们自己版本的程序开头。

模块

除了 New 和各个 With* 选项之外,该包还导出 DefaultBaseURL 和 Version 常量、APIError 类型(每个错误代码对应一个 Code* 常量)、用于枚举输入的类型化常量(DatabaseRedis、GroupView、ResetPassword、SnapshotScopeDatabases……),以及与每种 API 结构对应的结构体,你可以在自己的代码中使用它们:

约定

Context 和 ID 在前,返回类型化数据

每个方法都以 context.Context 作为第一个参数、资源 ID 作为第二个参数,并返回普通结构体(没有方法,没有缓存)。json 标签就是 API 自身的字段名(created_at、version_id、lastModified、joinedAt、netIO……),因此 API 参考可直接适用:CreatedAt 即 created_at,VersionID 即 version_id。API 之后新增的字段会被忽略,因此永远不会导致解码失败。
  • 变更操作只返回 error,除非 API 返回数据(Envs.*、Deploys.SetWebhook、Deploys.LinkGithubApp、Databases.ResetCredentials 以及各 Create 方法)。
  • 当 API 未返回字符串结果时,其值为 ""。
  • API 可能以 null 发送的字段是指针:使用前请检查是否为 nil。
  • 计数器和字节大小为 int64。
  • 列表一次调用即完整返回:没有分页。
资源组是普通的结构体字段,因此可以保存方法值:

Workspace 应用

每个 appID 也接受组合形式 <appId>-<workspaceId>,用于操作通过 workspace 与你共享的应用。Workspaces.Get 和 Workspaces.List 返回原始 ID;组合 ID 需要你自行构建:

ID 会被编码

URL 路径中的 ID 会进行百分号编码。空的、. 或 .. 的 ID 会到达不同的路由,因此会在发送任何内容之前于本地以 INVALID_ID(状态 0)失败。Workspace 路由则将 ID 放在请求体中发送:在那里,INVALID_ID(400)来自服务器。

日期

start 和 end 参数(参见网络)是 time.Time 值,以 UTC 的 RFC 3339 格式(精确到整秒)发送。在响应中,API 的 ISO 8601 字符串会解码为 time.Time,而 API 以 Unix 毫秒发送的字段仍保持为数字(Plan.Duration 和 Uptime 为 *int64,FileEntry.LastModified 为 *float64):请使用 time.UnixMilli 进行转换。

超时

  • 默认截止时间仅在 ctx 没有截止时间时生效。ctx 上的截止时间始终优先,无论它比默认值更短还是更长,下限也包括在内。
  • 一个截止时间覆盖整个调用:每次尝试以及重试之间的等待。
  • WithTimeout(0)(或任何 d <= 0)会禁用所有默认截止时间,包括 2 分钟的下限。
每个方法都接受 ctx,因此你可以限制或取消任何调用:
ctx 到期的调用会返回代码为 TIMEOUT 的 *APIError,ctx 被取消的调用会返回 NETWORK_ERROR,两者的状态均为 0。它们可以解包为 context 的错误,因此 errors.Is(err, context.DeadlineExceeded) 和 errors.Is(err, context.Canceled) 都能正常工作。实时循环则直接返回 ctx.Err()。

账户

c.Account.Me(ctx) 返回已认证的用户,以及该密钥可见的应用和数据库。
c.Account.Snapshots(ctx, scope) 列出账户的所有 snapshot:参见 Snapshots。

平台状态

c.Service.Status(ctx) 返回公开的平台状态。该路由不需要密钥,并且它是唯一一个在使用空密钥构建的客户端上也能工作的方法。
unknown 表示检查本身无法运行:这并不代表发生了故障。

后续步骤

管理应用

状态、生命周期、日志和指标。

错误

错误类、重试和速率限制。

API 简介

基础 URL、身份验证和第一个请求。

CLI 快速开始

在终端中部署和管理应用。