*Client,所有地方都以 ctx 作为第一个参数,并引入资源组,同时修复了 v2 中所有已知的缺陷。它涵盖当前 API 的全部 67 个操作。
概览
构造和选项
按请求设置的选项:
逐个方法对照
api 是 v2 的 rest.Rest,c 是 v3 的 *squarecloud.Client。
类型
错误
rest.APIError(StatusCode、Code、Message)变为 squarecloud.APIError(Status、Code、Message、Method、Path):请将 StatusCode 重命名为 Status。rest.ErrorCode(err) 和 rest.IsRateLimit(err) 已被移除:请使用 errors.As 并检查 Code 或 Status == 429。
- 网络失败现在是
*APIError,Status为0,Code为NETWORK_ERROR或TIMEOUT,Message为原因的文本,并且可以解包为原因(errors.Is(err, context.Canceled)能正常工作)。 - 本地检查(
Status为0:INVALID_ID、FILE_TOO_LARGE、INVALID_API_KEY)以及不是 JSON 的 2xx 响应体(UNKNOWN_ERROR,Invalid JSON in HTTP <status> response)也是如此。 - 声明
"status": "error"的 2xx 响应体现在被视为错误(v2 将其报告为成功)。应用和数据库启动/停止时集群的拒绝会以 409CONTAINER_ALREADY_STARTED、CONTAINER_ALREADY_STOPPED、CONTAINER_TEMPORARILY_SUSPENDED、CONTAINER_NOT_FOUND、CONTAINER_INSUFFICIENT_DISK_SPACE、CONTAINER_NETWORK_CONFLICT或ACTION_FAILED返回,且没有消息。SDK 会将“已经……”类的响应作为错误返回:如有需要,请自行将其视为成功。 - 没有代码的响应的
Code为UNKNOWN_ERROR。 - 已过期的 API 密钥与未知密钥一样返回 401
ACCESS_DENIED。 - API 公开记录的每个代码都有一个
Code*常量。API 现在在原先发送RATE_LIMIT和RATE_LIMIT_EXCEEDED的地方发送 429RATE_LIMITED(CodeRateLimited);CodeRateLimit和CodeRateLimitExceeded仍然保留,但已弃用。 - 每个
AI.Chat错误都采用 OpenAI 格式,带有小写代码(access_denied、rate_limit_exceeded、server_overloaded……),Code会原样携带这些代码。 Error()输出squarecloud: <METHOD> <path>: HTTP <status> <CODE>: <message>(v2:squarecloud: <message> (<CODE>, HTTP <status>))。请根据字段进行匹配,而不是依赖文本。
行为变更
- 空 API 密钥:
New("")(或仅含空白字符的密钥)仍然返回一个客户端(它无法返回错误),但除Service.Status外的每个调用都会在本地以INVALID_API_KEY失败。 - Snapshot 202: v2 返回
StatusCode为 202 的*APIError。v3 返回Pending: true的SnapshotCreated,错误为nil。 - 实时:
Next现在返回RealtimeEvent。请根据ev.Event(system、status、logs、error、message)进行分支处理。对于日志,打印ev.Line(\u0001/\u0002字节已被去除;ev.Data保持为原始帧),并使用ev.Stream区分 stdout/stderr。对于状态,请使用ev.Status:在状态事件中永远不为nil,并在各帧和重新连接之间进行浅合并。在REALTIME_DISCONNECTED之后,Next返回io.EOF。流不再在 30 秒后中断,重新连接会在上一次打开后至少等待 5.5 秒,并且在响应头到达之前,打开阶段受客户端超时的限制。参见实时。 - 超时: v2 对所有调用使用固定 30 秒的
http.Client超时。v3 仅在ctx没有截止时间时才应用默认截止时间:大多数调用使用客户端超时(WithTimeout,30 秒);启动/停止/重启、数据库创建、snapshot 创建/恢复以及AI.Chat至少为 2 分钟;上传、内容超过 1 MiB 的文件写入以及 snapshot 下载则没有截止时间。WithTimeout(0)会禁用所有这些截止时间。 - 空的网络窗口: 当窗口内没有流量时,
Analytics、Errors和Performance返回nil指针。 - 请求头: 每个 API 请求都会发送
Accept: application/json(实时则为text/event-stream)。默认的User-Agent从Square GO改为squarecloud-sdk-go/3.0.0(WithUserAgent仍然可以覆盖它)。 - ID: 每个 ID 现在都会作为单个路径段进行百分号编码(v2 会将其原样拼接到路径中),空的、
.或..的 ID 会在本地以INVALID_ID失败。 - 文件写入: v2 总是以字符串发送内容,这会损坏二进制文件,并且无法写入空文件。v3 始终以 base64 编码发送内容,因此每个字节都能完整往返,空内容会写入一个空文件,超过 10 MB 的内容会在本地以
FILE_TOO_LARGE失败。对于无法解码的内容,API 返回 400INVALID_CONTENT。 - 文件读取: v3 始终以 base64 请求并解码,而不是像 v2 那样读取 JSON 字节数组(API 已弃用该格式)。超过 10 MB 的文件返回 413
FILE_TOO_LARGE。 - 文件列表: 列出不存在的目录会返回 404
FILE_NOT_FOUND;以前返回的是空列表。 - Snapshots: 列表条目携带来自 API 的
VersionID和URL;不再从Key中解析任何内容。 - 重试: 新增。GET 的网络错误、503
UPLOAD_BUSY/ANALYTICS_BUSY以及 GET 上的 503DATABASE_UNAVAILABLE默认重试两次;WithMaxRetries(0)可恢复 v2 的行为。DATABASE_UNAVAILABLE可能在变更操作已经开始之后才到达,因此 SDK 从不在其他方法上重试它;如有需要,请自行重试幂等的变更操作。参见重试。 - Go 版本: 最低版本从 Go 1.24 降至 Go 1.22。
后续步骤
客户端
安装 SDK 并创建客户端。
错误
错误类、重试和速率限制。

