Я добавил ниже новый код в файл 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?
Рабочий пример приветствуется.
Чтобы протестировать сервер 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: