Как вызвать на сервер gRPC через HTTP/1.1 из команды cURL или в интернет-браузере

Я добавил ниже новый код в файл protobuf и скомпилировал его, чтобы получить сгенерированные файлы grpc_pb.

service EchoService {
  rpc Echo(EchoMessage) returns (EchoMessage) {
    #-----New code start-----
    option (google.api.http) = {
      post: "/v1/echo"
      body: "*"
    };
    #-----New code end------
  }
}

Из команды cURL, выполненной ниже команды

curl -X POST -k https://localhost:10000/v1/echo -d '{"Key": "Value"}'

После выполнения вышеуказанного запроса не удалось получить надлежащий ответ.

Я сомневаюсь, что какие-либо изменения кода на стороне сервера необходимы для подготовки ответа для отправки обратно вызывающему абоненту? Если да, пожалуйста, предложите мне код (Java), а также как сделать запрос. Если нет, то как нам сделать http-запрос к grpc?

Рабочий пример приветствуется.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
20 558
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы протестировать сервер gRPC без клиента, мы должны использовать grpcurl, а не curl. Пожалуйста, взгляните на https://github.com/fullstorydev/grpcurl

Однако, исходя из моего опыта, необходимо, чтобы это работало. Во-первых, убедитесь, что ваш сервис поддерживает Отражение, вы можете прочитать об этом из https://github.com/sourcegraph/gophercon-2018-liveblog/issues/27. Существуют разные способы выполнения Отражение в разных языках программирования. Мой совет: просто сделайте это на этапе разработки, иначе люди могут запросить вашу конечную точку gRPC. Может быть, вы можете использовать if (), чтобы сделать для него условный блок. Для Голанга я сделал это

import "google.golang.org/grpc/reflection"

if os.Getenv("GO_ENV") == "development" {
    reflection.Register(s)
}

затем вам нужно знать доступные службы на вашем сервере gRPC. Есть два способа узнать структуру. Во-первых, вы можете прочитать их из своего прото-файла, во-вторых, выполнив команду grpcurl localhost:10000 list

  • Если вам нравится читать из вашего прото-файла, путь должен быть packageName.Service/rpcMethodName. Итак, исходя из вашего прототипа, это должно быть что-то вроде EchoService/Echo или, если у вас есть имя пакета, оно будет packageName.EchoService/Echo
  • Если вы предпочитаете делать grpcurl localhost:10000 list, просто введите эту команду, и она выведет путь к сервису.

Последнее, что нужно отметить, когда вы тестируете его локально и не настраиваете SSL/TLS, пожалуйста, используйте опцию -plaintext, иначе он сообщит вам, что рукопожатие TLS не удалось.

Пример команды, основанный на вашем прототипе, вызов в локальном режиме будет выглядеть так:

grpcurl -plaintext -d '{"Key": "Value"}' 127.0.0.1:10000 EchoService/Echo

Надеюсь, поможет.


ОБНОВЛЕНИЕ 30 июня 2020 г.:

После нескольких месяцев работы с gRPC я нашел еще один интересный инструмент gRPC:

Другие вопросы по теме