首页 > 解决方案 > 如何查询 gRPC 端点?

问题描述

这可能是一个愚蠢的问题,但我正在努力弄清楚 gRPC 究竟做了什么。我有这个 endpoing access-mainnet-beta.onflow.org:9000 ( https://docs.onflow.org/access-api/ )

我很想访问,但我不一定想下载他们的 SDK。

我从来没有使用过仅 rpc 的 REST 和 websocket API,所以我很难理解如何让 gRPC 运行。不幸的是,对 gRPC 的所有“基本介绍”对我来说没有任何意义,而且我还没有找到关于如何从 gRPC 端点请求数据的教程。

任何帮助都会很棒,即使它是指向可以向我解释的教程的链接。

问候,

标签: apigrpcrpc

解决方案


gRPCurl是与 gRPC 服务器交互的有用工具。

REST 和 gRPC 之间存在显着差异:

  1. gRPC使用HTTP2(REST一般使用HTTP1.1)
  2. gRPC 需要一个模式(通常是一个 protobuf)

如果 gRPC 服务支持反射,您将能够grpcurl [host:port] list. 如果没有,您需要获取模式(protobuf)的副本,以便 gRPCurl 可以与服务器交互。

我无法连接,access-mainnet-beta.onflow.org:9000但是:

grpcurl \
-plaintext \
access.devnet.nodes.onflow.org:9000 \
  list
Failed to list services: server does not support the reflection API

因此,看来您需要获取 protos 并将它们传递给grpcurl.

和:

# list
grpcurl flow-testnet.g.alchemy.com:443 list
flow.access.AccessAPI

# list methods for the above service
grpcurl flow-testnet.g.alchemy.com:443 list flow.access.AccessAPI
flow.access.AccessAPI.ExecuteScriptAtBlockHeight
flow.access.AccessAPI.ExecuteScriptAtBlockID
flow.access.AccessAPI.ExecuteScriptAtLatestBlock
flow.access.AccessAPI.GetAccount
flow.access.AccessAPI.GetAccountAtBlockHeight
flow.access.AccessAPI.GetAccountAtLatestBlock
flow.access.AccessAPI.GetBlockByHeight
flow.access.AccessAPI.GetBlockByID
flow.access.AccessAPI.GetBlockHeaderByHeight
flow.access.AccessAPI.GetBlockHeaderByID
flow.access.AccessAPI.GetCollectionByID
flow.access.AccessAPI.GetEventsForBlockIDs
flow.access.AccessAPI.GetEventsForHeightRange
flow.access.AccessAPI.GetLatestBlock
flow.access.AccessAPI.GetLatestBlockHeader
flow.access.AccessAPI.GetLatestProtocolStateSnapshot
flow.access.AccessAPI.GetNetworkParameters
flow.access.AccessAPI.GetTransaction
flow.access.AccessAPI.GetTransactionResult
flow.access.AccessAPI.Ping
flow.access.AccessAPI.SendTransaction

# describe `Ping`
grpcurl flow-testnet.g.alchemy.com:443 describe flow.access.AccessAPI.Ping
flow.access.AccessAPI.Ping is a method:
rpc Ping ( .flow.access.PingRequest ) returns ( .flow.access.PingResponse );

# invoke `Ping`
grpcurl flow-testnet.g.alchemy.com:443 flow.access.AccessAPI.Ping
ERROR:
  Code: Unauthenticated
  Message: Missing api_key in metadata

我猜你需要一个 API 密钥才能继续。


推荐阅读