亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Gokit:在傳輸層中驗證請求/有效負載

Gokit:在傳輸層中驗證請求/有效負載

Go
慕的地8271018 2022-08-01 18:38:27
我正在使用 go-kit 創建 RPC 終結點。我正在創建一個這樣的端點httptransport.NewServer(    endPoint.MakeGetBlogEndPoint(blogService),    transport.DecodeGetBlogRequest,    transport.EncodeGetBlogResponse以下是我的解碼GetBlogRequest函數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但是由于我在這個函數中沒有RecertWriter引用,所以我不確定如何做到這一點。我正在遵循go-kit文檔中的這個例子 https://gokit.io/examples/stringsvc.html是否有效的假設是,請求/有效負載應僅在傳輸層中進行驗證,而服務層應僅在請求/有效負載有效時才應調用?如果是,如何在此示例中執行此操作?
查看完整描述

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響應中拋出和錯誤。


查看完整回答
反對 回復 2022-08-01
?
鴻蒙傳說

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 中,它們位于代碼包中。


查看完整回答
反對 回復 2022-08-01
  • 2 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號