登录
首页 >  Golang >  Go问答

Gokit:验证传输层请求和有效数据

来源:stackoverflow

时间:2024-03-01 21:18:24 400浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Gokit:验证传输层请求和有效数据》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我正在使用 go-kit 创建 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 请求,如果发现无效,则仅从此处发送带有有效错误代码的响应,而不将其传递到服务层。即,如果 id 不是有效数字,则从此处返回 400 bad request 响应。

但是由于我在此函数中没有 responsewriter 引用,所以我不知道该怎么做。

我正在关注 go-kit 文档中的这个示例 https://gokit.io/examples/stringsvc.html

请求/有效负载仅应在传输层中验证并且仅当请求/有效负载有效时才应调用服务层,这是一个有效的假设吗?如果是,在本例中该怎么做?


解决方案


您可以使用 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...,
))

如果您的请求验证无效,并且根据您在 yourerrorencoderfunc() 中编写的任何格式在 http 响应中抛出错误,这将在传输层停止。

不能 100% 确定这是否适用以及 go-kit grpc :

您有一个错误返回变量。用它来表明存在问题。在 go grpc 模块中,有一个 status package 用于返回带有状态代码的错误。如果您返回带有状态代码的错误,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 使用 different status codes。在 go 中,它们位于 codes package 中。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Gokit:验证传输层请求和有效数据》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>