如何将我的工作curl命令映射到grpc-web调用

时间:2018-10-16 16:14:05

标签: node.js proxy grpc http2 grpc-web

我正在尝试获取grpc-web的有效实例。我有一个看起来像这样的后端服务。

var grpc      = require('grpc');
var messages  = require('./example_pb');
var service   = require('./example_grpc_pb');


function exampleOne(call) {
    var response = new messages.ExampleOneRequest();
    call.write(response);
    call.end();
}

function main() {
   var server = new grpc.Server();
   server.addService(
       services.MyExampleService,
       {
           example : exampleOne
       }
    );
    server.bind('0.0.0.0:8050', grpc.ServerCredentials.createInsecure());
    server.start();
}
main();

我已经在服务器端“客户端”上对此进行了测试,因此现在我尝试连接基于Web浏览器的实际客户端。首先,我设置代理,这显然是必需的吗?我决定使用基于GoLang的grpcwebproxy,根据grpc-web文档,这似乎是可以接受的选择。

>> grpcwebproxy --backend_addr=localhost:8050 \                                                                                                                                                                       
--server_tls_cert_file=/usr2/certs/server/localhost.localdomain.crt \                                                                                                                                          
--server_tls_key_file=/usr2/certs/server/localhost.localdomain.key  

输出看起来像这样

INFO[0000] dialing to target with scheme: ""             system=system
INFO[0000] ccResolverWrapper: sending new addresses to cc: [{localhost:8050 0  <nil>}]  system=system
INFO[0000] listening for http on: [::]:8080             
INFO[0000] listening for http_tls on: [::]:8443         
INFO[0000] pickfirstBalancer: HandleSubConnStateChange: 0xc4201638a0, CONNECTING  system=system
INFO[0000] pickfirstBalancer: HandleSubConnStateChange: 0xc4201638a0, READY  system=system

我无法正常使用网络浏览器,只是遇到了一些与通用/ CORS相关的500个错误。

我回到服务器端,决定卷曲代理。当前的curl版本似乎不支持http2,所以我改用a tool called h2c

长话短说,我尝试ping tls端口8443并获得以下内容(最有前景)。

>> ./h2c_linux_amd64 get https://localhost:8443/service.path/ExampleOne

invalid gRPC request method

我尝试

>> ./h2c_linux_amd64 get http://localhost:8443/service.path/ExampleOne

http connections not supported.

我尝试

>> ./h2c_linux_amd64 get http://localhost:8080/service.path/ExampleOne

http connections not supported.

我尝试

>> ./h2c_linux_amd64 get https://localhost:8080/service.path/ExampleOne

Failed to connect to localhost:8080: tls: oversized record received with length 20527

我不希望得到即时的“这是您的解决方案”类型的答案,因为我遗漏了很多东西,但是没有人对在何处使用它有任何建议吗?

我得到的错误

"invalid gRPC request method"

似乎是最有前途的,如果是通用的。

编辑:

似乎已经接近一点,至少是调试服务器端。回到使用卷发。这是我的命令

curl 'https://localhost:8443/service.path/ExampleOne' \
-H 'content-type: application/grpc-web+proto' \
-H 'x-grpc-web: 1' \
-H 'authority: localhost:8443' \
--data-binary $'\x00\x00\x00\x00\x04\n\x02yo' \
--insecure

使用此命令,我可以通过grpcwebproxy使其到达我的服务,然后再返回另一端。为curl提供二进制字符串似乎可以解决问题。我说这是因为

curl 'https://localhost:8443/service.path/ExampleOne' \
-H 'content-type: application/grpc-web+proto' \
-H 'x-grpc-web: 1' \
-H 'authority: localhost:8443' \
--insecure

导致错误消息

gRPC requires HTTP/2

现在我需要将上述curl命令映射到有效的grpc-web请求中。

编辑2:

我现在正需要证书。来自浏览器的代码击中了我的grpcwebproxy,但我看到了错误消息

2018/10/17 12:21:56 http2: server: error reading preface from client 127.0.0.1:45056: remote error: tls: unknown certificate authority
2018/10/17 12:21:56 http2: server: error reading preface from client 127.0.0.1:45058: remote error: tls: unknown certificate authority
2018/10/17 12:21:56 http2: server: error reading preface from client 127.0.0.1:45060: remote error: tls: unknown certificate authority

这发生在grpcwebproxy的输出中,所以我知道请求至少在此发出。

我想通过添加--insecure标记来解决上述问题,不确定如何在浏览器中复制它。

1 个答案:

答案 0 :(得分:1)

您有一个选择,就是从我们的Echo示例开始,然后从那里进行调整。我只是尝试了我们的示例(使用grpcwebproxy的示例),并且可以正常工作。

$ git clone https://github.com/grpc/grpc-web
$ cd grpc-web
$ docker-compose build prereqs common node-server grpcwebproxy binary-client
$ docker-compose up -d node-server grpcwebproxy binary-client

浏览器:localhost:8081 / echotest.html

从浏览器中,如果我“复制为cURL”,我得到了

curl 'http://localhost:8080/grpc.gateway.testing.EchoService/Echo' -H 'Pragma: no-cache' -H 'X-User-Agent: grpc-web-javascript/0.1' -H 'Origin: http://localhost:8081' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9' -H 'custom-header-1: value1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36' -H 'Content-Type: application/grpc-web+proto' -H 'Accept: */*' -H 'X-Grpc-Web: 1' -H 'Cache-Control: no-cache' -H 'Referer: http://localhost:8081/echotest.html' -H 'Connection: keep-alive' --data-binary $'\x00\x00\x00\x00\x05\n\x03abc' --compressed