如何在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
相关产品推荐
相关产品推荐

