Gokit:验证传输层中的请求/有效负载

Gokit:验证传输层中的请求/有效负载,go,rpc,endpoint,transport-layer-protocol,Go,Rpc,Endpoint,Transport Layer Protocol,我正在使用go工具包创建一个RPC端点。我正在创建这样一个端点 httptransport.NewServer( endPoint.MakeGetBlogEndPoint(blogService), transport.DecodeGetBlogRequest, transport.EncodeGetBlogResponse 下面是我的DecodeGetBlogRequest函数 func DecodeGetBlogRequest(c context.Context,

我正在使用go工具包创建一个RPC端点。我正在创建这样一个端点

httptransport.NewServer(
    endPoint.MakeGetBlogEndPoint(blogService),
    transport.DecodeGetBlogRequest,
    transport.EncodeGetBlogResponse
下面是我的DecodeGetBlogRequest函数

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, err
        }
        req := endPoint.GetBlogRequest{
            ID: id,
        }
        return req, nil
    }
我想做的是验证这个函数中的HTTP请求,如果发现无效,只从这里发送一个带有有效错误代码的响应,而不将其传递给服务层。i、 e.如果ID不是有效的数字,则从此处返回
400错误请求
响应

但是由于我在这个函数中没有ResponseWriter引用,我不知道如何做

下面是go kit文档中的示例


仅在传输层验证请求/有效负载,并且仅在请求/有效负载有效时调用服务层,这是一个有效的假设吗?如果是,在本例中如何操作?

无法100%确定这是否也适用于
go kit
grpc:

您有一个错误返回变量。用它来表示有问题。在go grpc模块中,有一个返回错误和状态代码的命令。如果返回带有状态代码的错误,grpc层将从错误中获取代码并将其发送回

例如:

func DecodeGetBlogRequest(c context.context,r*http.Request)(接口{},错误){
变量:=mux.vars(r)
id,err:=strconv.Atoi(vars[“id”])
如果错误!=零{
返回nil,status.Error(code.InvalidArgument,err.Error())
}
请求:=endPoint.GetBlogRequest{
ID:ID,
}
返回请求,无
}

还请注意,grpc使用。在Go中,它们位于。

您可以使用返回服务器选项的ServerErrorEncoder(可在github.com/Go kit/kit/transport/Server.Go中找到)。 基本上,在传输层中,除了Decode和Encode函数外,还可以定义一个YourErrorEncoderFunc()函数,如下所示。这将捕获传输层中抛出的任何错误。
YourErrorEncoderFunc(context.context,err error,w http.ResponseWriter)

您需要在端点注册中将此函数作为选项附加,如:

ABCOpts := []httptransport.ServerOption{
            httptransport.ServerErrorEncoder(YourErrorEncoderFunc),
            }

r.Methods("GET").Path("/api/v1/abc/def").Handler(httptransport.NewServer(
    endpoints.GetDataEndpoint,
    DecodeGetRequest,
    EncodeGetResponse,
    ABCOpts...,
))

如果您的请求验证无效,并根据您在ErrorEncoderFunc()中编写的任何格式在http响应中抛出和出错,则此操作将在传输层停止。

您的回答引导我找到了我的解决方案。我开始在go kit中寻找“类似于状态包的东西”,并找到了解决方案,即
ServerErrorEncoder
函数。谢谢