grpc-gateway 添加参数校验
    		       		warning:
    		            这篇文章距离上次修改已过438天,其中的内容可能已经有所变动。
    		        
        		                
                要在gRPC Gateway中添加参数验证,你可以使用一个HTTP中间件来拦截请求并进行验证。以下是一个使用Go和Protocol Buffers的示例代码:
首先,定义你的proto文件中的请求消息:
// example.proto
 
syntax = "proto3";
 
package example;
 
import "google/api/annotations.proto";
 
message StringMessage {
  string value = 1;
}
 
service ExampleService {
  rpc Echo(StringMessage) returns (StringMessage) {
    option (google.api.http) = {
      post: "/v1/example/echo"
      body: "*"
    };
  }
}然后,在你的gRPC Gateway服务中,你可以添加一个中间件来验证参数:
package main
 
import (
    "context"
    "net/http"
 
    "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    "google.golang.org/grpc"
)
 
// Your gRPC client and server must be initialized
// ...
 
func validateParameters(w http.ResponseWriter, r *http.Request, varMap map[string]string) bool {
    // 验证逻辑,如果参数不符合要求,返回false
    // 例如,检查"value"参数是否非空
    value := varMap["value"]
    if value == "" {
        http.Error(w, "value parameter is required", http.StatusBadRequest)
        return false
    }
    return true
}
 
func run() error {
    ctx := context.Background()
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()
 
    mux := runtime.NewServeMux(
        runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true}),
    )
 
    // 注册你的服务
    err := RegisterExampleServiceHandlerFromEndpoint(ctx, mux, ":50051", []grpc.DialOption{grpc.WithInsecure()})
    if err != nil {
        return err
    }
 
    httpServer := &http.Server{
        Addr:    ":8080",
        Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            if r.Method == "POST" && r.URL.Path == "/v1/example/echo" {
                if !validateParameters(w, r, mux.Vars(r)) {
                    return
                }
            }
            mux.ServeHTTP(w, r)
        }),
    }
 
    return httpServer.ListenAndServe()
}
 
func main() {
    if err := run(); err != nil {
        panic(err)
    }
}在这个例子中,validateParameters 函数会在处理请求之前被调用。如果参数不符合要求,它会向客户端返回一个错误,并且不会继续处理请求。你可以根据你的需求编写更复杂的验证逻辑。
评论已关闭