2 回答

TA貢獻1866條經驗 獲得超5個贊
您可以使用 ServerErrorEncoder 返回 Server 選項(可以在 github.com/go-kit/kit/transport/server.go 中找到)?;旧?,在您的傳輸層中,除了解碼和編碼函數之外,您還可以定義一個 YourErrorEncoderFunc() 函數,該函數可能如下所示。這將捕獲傳輸層中引發的任何錯誤。
YourErrorEncoderFunc(_ context.上下文,錯誤錯誤,w http。響應器)。
您需要在終端節點注冊中將此函數作為選項附加,例如:
ABCOpts := []httptransport.ServerOption{
httptransport.ServerErrorEncoder(YourErrorEncoderFunc),
}
r.Methods("GET").Path("/api/v1/abc/def").Handler(httptransport.NewServer(
endpoints.GetDataEndpoint,
DecodeGetRequest,
EncodeGetResponse,
ABCOpts...,
))
如果您的請求驗證無效,這將停止在傳輸層,并根據您在YourErrorEncoderFunc()中編寫的任何格式在http響應中拋出和錯誤。

TA貢獻1865條經驗 獲得超7個贊
不能100%確定這是否也適用于gpc:go-kit
您有一個錯誤返回變量。用它來表示存在問題。在 go grpc 模塊中,有一個狀態包用于返回帶有狀態代碼的錯誤。如果返回帶有狀態代碼的錯誤,grpc 層將從錯誤中獲取代碼并將其發送回去。
例如:
func DecodeGetBlogRequest(c context.Context, r *http.Request) (interface{}, error) {
vars := mux.Vars(r)
id, err := strconv.Atoi(vars["id"])
if err != nil {
return nil, status.Error(codes.InvalidArgument, err.Error())
}
req := endPoint.GetBlogRequest{
ID: id,
}
return req, nil
}
另請注意,grpc 使用不同的狀態代碼。在 Go 中,它們位于代碼包中。
- 2 回答
- 0 關注
- 186 瀏覽
添加回答
舉報