如何将带有请求正文的 HTTP DELETE 转码为 gRPC

Posted

技术标签:

【中文标题】如何将带有请求正文的 HTTP DELETE 转码为 gRPC【英文标题】:How to Transcode HTTP DELETE with Request Body to gRPC 【发布时间】:2021-09-05 08:41:42 【问题描述】:

我是使用带有 proto3 的 gRPC 的新手,我使用 Transcoding HTTP/JSON to gRPC 将现有的 http 端点迁移到 grpc。

但是我有带有请求正文的 http DELETE 请求。我已尝试关注,但出现错误。

Grpc 端点:

  rpc DeleteFile(DeleteFileRequest) returns (DeleteFileResponse) 
    option (google.api.http) = 
      delete: "/v2/file/delete/path"
      body: "*"
    ;
  

protoc gererate 命令如下

protoc -I ./proto --go-grpc_out=. --go_out=. --grpc-gateway_out=. --openapiv2_out=./openapi ./proto/myapp.proto

我遇到了错误

--grpc-gateway_out: must not set request body when http method is DELETE except allow_delete_body option is true

然后我将--allow_delete_body=true 添加到我的 protoc 命令中,如下所示。

--allow_delete_body=true
error : Unknown flag: --allow_delete_body

--grpc-gateway_opt allow_delete_body=true 
error : must not set request body when http method is DELETE except allow_delete_body option is true

我的 go.mod 中的 grpc 版本

github.com/grpc-ecosystem/grpc-gateway/v2 v2.3.0
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
google.golang.org/genproto v0.0.0-20210224155714-063164c882e6
google.golang.org/grpc v1.36.0
google.golang.org/protobuf v1.26.0

谁能解释一下我如何将 HTTP DELETE 转码为带有请求正文的 grpc。

【问题讨论】:

【参考方案1】:

协议总是有接线问题。建议改用buf。 buf.gen.yaml 的配置应该是这样的,而且效果很好:

version: v1beta1
plugins:
  - name: go
    out: proto
    opt: paths=source_relative
  - name: go-grpc
    out: proto
    opt: paths=source_relative,require_unimplemented_servers=false
  - name: grpc-gateway
    out: proto
    opt:
      - paths=source_relative
      - allow_delete_body=true

对于这个问题,我在Not able to pass allow_delete_body to protoc-gen-grpc-gateway找到了答案,这个命令对我有用,但在添加--openapiv2_out=./openapi后不起作用:

protoc -I ./proto --go-grpc_out=. --go_out=. --grpc-gateway_out=allow_delete_body=true:. ./proto/myapp.proto

【讨论】:

感谢您的回复。但我目前无法更改协议。所以我需要找到一种方法来使用 protoc 来做到这一点。对于未来的发展,我会记住您的建议。 用那个更新了问题。【参考方案2】:

在网上花费时间并尝试以不同方式应用标志后,我找到了适合我的工作命令。感谢大家帮忙解决这个问题。

这是我的工作命令:

protoc -I ./proto --go-grpc_out=. --go_out=. --grpc-gateway_out=allow_delete_body=true:. --openapiv2_opt allow_delete_body=true --openapiv2_out=./openapi ./proto/myapp.proto 

【讨论】:

以上是关于如何将带有请求正文的 HTTP DELETE 转码为 gRPC的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数中的参数用于带有 Dio 包的 http 请求正文

为啥我的 HTTP DELETE 请求正文显示为未定义?

DELETE 请求正文的 RESTful 替代方案

带有字符串正文的 ios HTTP Post

REST API 设计 - 使用请求正文删除多个项目

带有正文示例的 Angular Put 请求