如何实现 gRPC 网关 mux 处理程序来处理多个 http 方法

nip*_*una 6 http go gorilla grpc-gateway grpc-go

我有使用gorilla/mux实现的 REST HTTP 处理程序。我正在尝试将它们迁移到 gRPC 中。有一些处理程序执行文件上传和下载。因此,我的客户决定在 gRPC 网关中实现这些处理程序。

我的 mux 处理程序之一处理多个 HTTP 方法,并根据一个处理程序函数中的 HTTP 方法执行操作。示例代码如下所示。

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc(`/doSomething`, func(writer http.ResponseWriter, request *http.Request) {
        switch request.Method {
        case http.MethodPost:
            // create something
            fmt.Fprint(writer, "POST")
        case http.MethodGet:
            // return something
            fmt.Fprint(writer, "GET")
        case http.MethodPut:
            // update something
            fmt.Fprint(writer, "PUT")
        case http.MethodDelete:
            // delete something
            fmt.Fprint(writer, "DELETE")

        }
    })
    http.ListenAndServe(`:5000`, r)
}
Run Code Online (Sandbox Code Playgroud)

当我实现类似的 grpc 网关复用处理程序来使用grpc-ecosystem/grpc-gateway/v2.3.0处理这些请求时,我必须编写单独的处理程序函数来处理同一路径的不同 HTTP 方法。示例代码如下。

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    "net/http"
)

func main() {
    r := mux.NewRouter()
    grpcGatewayHandler := runtime.NewServeMux()
    r.PathPrefix("/").Handler(grpcGatewayHandler)
    _ = grpcGatewayHandler.HandlePath(`POST`, `/doSomething`,
        func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
            fmt.Fprint(w, "POST")
    })
    _ = grpcGatewayHandler.HandlePath(`PUT`, `/doSomething`,
        func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
            fmt.Fprint(w, "PUT")
        })
    _ = grpcGatewayHandler.HandlePath(`GET`, `/doSomething`,
        func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
            fmt.Fprint(w, "GET")
        })
    _ = grpcGatewayHandler.HandlePath(`DELETE`, `/doSomething`,
        func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
            fmt.Fprint(w, "DELETE")
        })
    http.ListenAndServe(`:5000`, r)
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何替代解决方案来在同一处理程序函数中使用不同的方法。

  1. 有没有办法使用 grpc-gateway 在一个处理程序中处理不同的方法?
  2. 单独处理方法和在一个处理函数中处理方法没有区别吗?

小智 0

你的原型文件将是这样的

syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/httpbody.proto";


service SampleService {
  rpc doSomethingPost (Request) returns (google.api.HttpBody) {
    option (google.api.http) = {
      post: "/doSomething"
    };
  }

  rpc doSomethingPUT (Request) returns (google.api.HttpBody) {
    option (google.api.http) = {
      put: "/doSomething"
    };
  }

  rpc doSomethingGet (Request) returns (google.api.HttpBody) {
    option (google.api.http) = {
      get: "/doSomething"
    };
  }

}
Run Code Online (Sandbox Code Playgroud)