如何通过Golang AWS SDK捕获postToConnection调用的410错误?
检测AWS SDK v2中PostToConnection的410错误
在AWS SDK for Go v2中,PostToConnection返回的410错误对应服务端的GoneException(表示连接已失效),你可以通过两种方式精准检测该错误:
方式1:断言具体异常类型
利用Go的errors.As将返回的错误断言为apigatewaymanagementapi/types.GoneException类型,这是最精准的方式:
import ( "errors" "fmt" "context" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi" "github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi/types" ) func sendToConnection(client *apigatewaymanagementapi.Client, connID string, data []byte) error { _, err := client.PostToConnection(context.TODO(), &apigatewaymanagementapi.PostToConnectionInput{ ConnectionId: aws.String(connID), Data: data, }) if err != nil { var goneErr *types.GoneException if errors.As(err, &goneErr) { // 确认是410错误:连接已断开且未触发@disconnect return fmt.Errorf("connection %s is no longer valid: %w", connID, err) } // 处理其他类型的错误 return fmt.Errorf("failed to send message: %w", err) } return nil }
方式2:检查HTTP状态码
如果需要更通用的HTTP状态码判断,可以使用SDK提供的aws.IsHttpError函数:
import ( "fmt" "context" "net/http" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/apigatewaymanagementapi" ) func sendToConnection(client *apigatewaymanagementapi.Client, connID string, data []byte) error { _, err := client.PostToConnection(context.TODO(), &apigatewaymanagementapi.PostToConnectionInput{ ConnectionId: aws.String(connID), Data: data, }) if err != nil { if aws.IsHttpError(err, http.StatusGone) { // http.StatusGone对应410状态码 return fmt.Errorf("connection %s has been disconnected: %w", connID, err) } return fmt.Errorf("failed to send message: %w", err) } return nil }
额外说明
当检测到该410错误时,说明WebSocket连接已实际断开但未触发@disconnect路由,此时你应该手动清理该连接ID的相关存储(比如从数据库、缓存中移除),避免后续无效的API调用。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

