You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Go语言中从AWS SDK请求获取HTTPS响应错误码并转换为自定义错误类型

如何在Go语言中从AWS SDK请求获取HTTPS响应错误码并转换为自定义错误类型

我完全懂你的困扰——用AWS Cognito做用户认证API,想把SDK返回的错误转换成自己定义的带HTTP状态码的错误类型,但现在卡在拿不到正确的HTTPS状态码上对吧?咱们一步步来解决这个问题。

首先得指出你当前代码里的一个小问题:你用smithy.APIError的ErrorCode()方法拿到的其实是AWS的业务错误码(比如NotAuthorizedException、UserNotFoundException这类),而不是你需要的HTTP状态码(比如401、400、500这些)。所以直接把它赋值给UsecaseError.Code是不符合预期的。

正确的解决思路:利用statuscode.StatusCoder接口

AWS SDK v2的绝大多数API错误(包括Cognito相关的错误)都实现了statuscode.StatusCoder这个接口,它提供了StatusCode()方法,可以直接获取对应的HTTP响应状态码。我们只需要在错误处理时同时检查这个接口就行。

修改后的代码示例

首先你需要导入对应的包:

import (
    "errors"
    "fmt"
    "net/http"
    "encoding/json"

    "github.com/aws/smithy-go"
    "github.com/aws/smithy-go/statuscode"
    "log/slog"
)

然后修改你的错误处理逻辑:

if err != nil {
    var apiErr smithy.APIError
    var statusErr statuscode.StatusCoder

    // 同时匹配两个接口,确保既能拿到AWS错误信息,又能拿到HTTP状态码
    if errors.As(err, &apiErr) && errors.As(err, &statusErr) {
        return nil, &usecase.UsecaseError{
            Code:    statusErr.StatusCode(), // 这里拿到的就是HTTP状态码(如401、400)
            Message: apiErr.ErrorMessage(),
        }
    }

    // 处理无法匹配的未知错误,统一返回500状态码
    slog.Error("未知错误", "error", err)
    return nil, &usecase.UsecaseError{
        Code:    http.StatusInternalServerError,
        Message: "服务内部错误,请稍后重试",
    }
}

额外优化:自定义错误的Error()方法

你现在手动拼接JSON字符串的方式容易出格式错误,建议改用json.Marshal来序列化,这样更可靠:

func (e *UsecaseError) Error() string {
    jsonBytes, err := json.Marshal(e)
    if err != nil {
        // 如果序列化失败,返回兜底的错误信息
        return fmt.Sprintf("无法序列化自定义错误: %v", err)
    }
    return string(jsonBytes)
}

补充说明

  • 并不是所有AWS SDK返回的错误都会同时实现这两个接口,比如一些客户端侧的错误(如网络连接失败)可能只实现error接口,这时候我们就统一返回500的内部错误,符合REST API的错误返回规范。
  • 如果你需要更细致地处理特定的AWS业务错误码,可以在匹配到apiErr后,通过apiErr.ErrorCode()判断具体错误类型,再自定义对应的HTTP状态码或错误信息(比如UserNotFoundException可以返回404状态码)。

备注:内容来源于stack exchange,提问作者Andrei Lamba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:33:00