【问题标题】:Make curl call to grpc service对 grpc 服务进行 curl 调用
【发布时间】:2021-07-19 12:03:42
【问题描述】:

我正在尝试使用 kotlin 学习 grpc 并使用以下 proto 定义制作一个简单的 grpc 服务:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "br.bortoti";
option java_outer_classname = "StockProto";
option objc_class_prefix = "HLW";

package br.bortoti;

import "google/api/annotations.proto";

service StockService {
  rpc GetStock (GetStockRequest) returns (Stock) {
    option(google.api.http) = {
      get: "V1/stocks/{stock}"
      body: "*"
    };
  }
}

message Stock {
  string ticker = 1;
}

message GetStockRequest {
  string ticker = 1;
}

message GetStockReply {
  string ticker = 1;
}

所以,我基本上是将服务映射到获取请求。

但是当我尝试从 curl 中调用这个 url 时:

curl http://localhost:8088/V1/stocks/1

我得到错误: curl:(1)在不允许时收到 HTTP/0.9

从服务器端我有:

INFO: Transport failed
io.netty.handler.codec.http2.Http2Exception: Unexpected HTTP/1.x request: GET /V1/stocks/1

如何让服务器接受 http 1.1 调用?有可能吗?

【问题讨论】:

  • gRPC 基于 HTTP/2 并且有自己的protocol specification。因此 gRPC 服务器不会接受普通的 curl 调用。 gRPC 有很多类似于curl 的命令行工具,其中一些广泛使用的是grpc_clibloomrpc
  • 你可能想看看这个grpcurl

标签: kotlin grpc


【解决方案1】:

也许这是两个问题。

gRPC 使用 HTTP2 并且需要大量标头,因此 curl 的请求很困难。也许你需要grpcurl

V1/stocks/{stock}的路径需要使用grpc-gateway toghter,更多细节可以参考grpc-gateway

既然你正在学习如何使用gRPC,也许你可以参考这个项目:helloworlde/grpc-java-sample,随意翻译中文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2018-08-03
    • 2019-10-12
    • 2011-04-22
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多