Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >grpc客户端代码在cpp/c++中元数据x- API -key/x-goog-api-key不工作,给我语音API的中断管道

grpc客户端代码在cpp/c++中元数据x- API -key/x-goog-api-key不工作,给我语音API的中断管道
EN

Stack Overflow用户
提问于 2019-11-27 05:40:50
回答 1查看 531关注 0票数 0

这是我使用c++与google cloud speech API交互的grpc的主要代码,您可以看到我正在调用context.AddMetadata("x-api-key","AIzaxxxxxxxxxxxxxxxxxxx");

在下面的日志中,我可以看到当客户端正在编写时,我们得到了一个断开的管道错误(这是远程正在关闭套接字)

请告诉我这是不是正确的做法

我也试过使用这个key (“x-goog-api-context.AddMetadata”,"AIzaxxxxxxxxxxxxxxxxx");

在文档中,根据此链接:https://cloud.google.com/endpoints/docs/grpc/restricting-api-access-with-api-keys

它提到了这个

根据是从gRPC客户端还是从=snippet客户端调用,使用API键调用API的API会有所不同。

gRPC客户端如果方法需要API键,则gRPC客户端需要将键值作为x- API -key元数据与其方法调用一起传递。

=snippet end=

哪一个不起作用?请解释一下为什么?

另外,在给出的示例中,有在python示例中提供了授权密钥的auth_token?这是x-api-key所必需的吗?

=

它工作的唯一方式是取消注释以下注释行,并且不使用grpc::InsecureChannelCredentials()

//auto creds = grpc::GoogleDefaultCredentials();

这是在创建通道时。您需要设置GOOGLE_APPLICATION_CREDENTIALS,它适用于一个服务帐户。

但我的要求是让客户端使用多个服务(可能有多个服务帐户)。那么,对于我的需求,推荐的方法是什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(int argc, char** argv) {
  // Create a Speech Stub connected to the speech service.
  //auto creds = grpc::GoogleDefaultCredentials();
  /*auto channel = grpc::CreateChannel("speech.googleapis.com", creds); */
  auto channel = grpc::CreateChannel("speech.googleapis.com", grpc::InsecureChannelCredentials());
  if (channel == nullptr)
   {
        std::cout << "could not allocate channel" <<std::endl;
        return -1;
  }
std::unique_ptr<Speech::Stub> speech(Speech::NewStub(channel));
  // Parse command line arguments.
  StreamingRecognizeRequest request;
  auto* streaming_config = request.mutable_streaming_config();
  char* file_path =
      ParseArguments(argc, argv, streaming_config->mutable_config());
  if (nullptr == file_path) {
    std::cerr << kUsage;
    return -1;
  }
  auto start = std::chrono::system_clock::now();
  std::time_t start_time = std::chrono::system_clock::to_time_t(start);
  std::cout << "time start " << std::ctime(&start_time) << std::endl;

  // Begin a stream.
  grpc::ClientContext context;

  context.AddMetadata("x-api-key", "AIzaSxxxxxxxxxxxxxxxxxxxxxxxxxx");

  auto streamer = speech->StreamingRecognize(&context);
  // Write the first request, containing the config only.
  streaming_config->set_interim_results(true);
  streamer->Write(request);
  // The microphone thread writes the audio content.
  std::thread microphone_thread(&MicrophoneThreadMain, streamer.get(),
                                file_path);
  // Read responses.
  StreamingRecognizeResponse response;
  while (streamer->Read(&response)) {  // Returns false when no more to read.
    // Dump the transcript of all the results.
    for (int r = 0; r < response.results_size(); ++r) {
      const auto& result = response.results(r);
      std::cout << "Result stability: " << result.stability() << std::endl;
      for (int a = 0; a < result.alternatives_size(); ++a) {
        const auto& alternative = result.alternatives(a);
        std::cout << alternative.confidence() << "\t"
                  << alternative.transcript() << std::endl;
      }
    }
  }

在日志中,我可以看到hTTP头被发送: I1127 16:06:19.028497113 30954 chttp2_transport.cc:1374] HTTP:0:HDR:CLI: x-api-HTTP: AIzaxxxxxxxxxxxxxxxxxx

但是在写套接字时,我收到了“管道断开”错误:

D1127 16:06:19.060125242 30954 tcp_posix.cc:1077]数据: 69 64 65 6e 74 74 79 2c 67 7a 69 70‘标识,gzip’I1127 16:06:19.060200892 30954 tcp_posix.cc:1111]写入:{"created":"@1574831179.060166760",“description”:“管道断开”,"errno":32,"fd":9,“file”:“src/I1127/lib/iomgr/tcp_posx.cc”,"file_line":998,"grpc_status":14,“os_error”:“管道破裂”,"syscall":"sendmsg","target_address":"ipv4:216.58.199.74:443"}

EN

回答 1

Stack Overflow用户

发布于 2019-11-28 02:52:31

我想出了一个组合,我们需要创建SSL连接来添加元数据x-goog- API -key="your API key“

在beginning...do中创建通道时,这代替了不安全的通道创建.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
auto creds = grpc::SslCredentials(grpc::SslCredentialsOptions());
auto channel = grpc::CreateChannel("speech.googleapis.com", creds);

当我们发送危及安全的API密钥时,确保连接安全是有意义的,“中间人”可以以某种方式嗅探到这一点!

我已经在google-speech讨论上打开了一个主题,以获得更多的答案,比如我们是否可以使用JWT令牌发送更大的编码授权数据。如果有什么有用的,我会在这里更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59063722

复制
相关文章
[StackOverflow] C++ gRPC 异步 API 实例与优势
转自 我的一个 StackOverflow 回答。因为答案比较长,而且感觉比较有意义,就翻译成了中文发了出来。 原问题: 我正在用 gRPC 构建一个要求高吞吐量的服务。但是我现在用 C++ 同步式 gRPC 编写的程序的吞吐量并不高。 我已经读过了 gRPC 文档,但是我并没有找到对于同步/异步 API 的区别的清晰解释。我只知道异步 API 可以控制完成队列(completion queue),而对于同步 API 来说是不可视的。 我的理解是同步 gRPC 会发送消息到 TCP 层,然后等待收到 “ack”,因此下个消息会被阻塞,而异步 API 会异步地发送消息,而不需要后面的消息等待前面的消息。
Miigon
2022/10/27
1.5K0
Cpp(九) gRPC protobuf for C++ 基本使用
Mac: https://github.com/Coxhuang/FKCpp/tree/master/gRPCDemo/macOS
Autooooooo
2021/02/02
5.7K0
gRPC: gRPC 接口与 Restful API 混合使用
这里我们并不是把 gRPC 接口转换成 Restful API,而是让不同的 gRPC 接口与 Restful API 共存。
尹东勋
2021/10/27
1.5K0
gRPC: gRPC 接口与 Restful API 混合使用
gRPC: 如何让 gRPC 提供 Restful API 服务?
本文将介绍如何让一个 gRPC 服务,同时提供 gRPC 和 Restful API。
尹东勋
2021/10/08
3K2
gRPC: 如何让 gRPC 提供 Restful API 服务?
Discourse 如何设置 API 的 key
在用户级别部分,你可以为这个 API Key 设置为全局访问还是只能是针对一个特定的用户使用这个 key。
HoneyMoose
2021/01/18
9590
Discourse 如何设置 API 的 key
设计Go API的管道使用原则
管道是并发安全的队列,用于在Go的轻量级线程(Go协程)之间安全地传递消息。总的来讲,这些原语是Go语言中最为称道的特色功能之一。这种消息传递范式使得开发者可以以易于理解的语义和控制流来协调管理多线程并发任务,而这胜过使用回调函数或者共享内存。 即使管道如此强大,在公有的API中却不常见。例如,我梳理过Go的标准库,在145个包中有超过6000个公有的API。在这上千个API中,去重后,只有5个用到了管道。 在公有的API中使用管道时,如何折衷考虑和取舍,缺乏指导。“共有API”,我是指“任何实现者和使用者
李海彬
2018/03/20
1.3K0
[StackOverflow] Difference between synchronous and asynchorous gRPC API
TLDR: Yes, async APIs would send the messages asynchronously without latter messages waiting, while synchronous APIs will block the whole thread while one message is being sent/received.
Miigon
2022/10/27
3950
语音识别API - 实现文字转语音
目录 搜狗(目前好用,免费) 百度(现在收费了,送一定额度) 腾讯(收费的) 搜狗(目前好用,免费) def textToAudio_Sougou(message, filePath):
小锋学长生活大爆炸
2022/03/29
12.3K0
Akismet插件获取key API的方法
作者:matrix 被围观: 2,308 次 发布时间:2011-09-25 分类:Wordpress 兼容并蓄 | 2 条评论 »
HHTjim 部落格
2022/09/26
6850
Akismet插件获取key API的方法
gRPC cpp 框架快速上手
在gRPC框架中,运行在不同机器上的客户端应用可以直接调用服务器端上「提供的方法」,使得我们可以更容易的创建一个分布式系统。
Mculover666
2021/11/02
1.1K0
gRPC: 如何实现文件上传 Restful API ?
注意,grpcEntry.GwMux.HandlePath() 一定要写到 boot.Bootstrap() 之后,否则会出现 Panic。
尹东勋
2021/10/19
2.8K0
gRPC: 如何实现文件上传 Restful API ?
grafana使用教程之API key
调用grafana的各种api都需要进行身份验证,获取一个api key在调用API时作为参数传入进去可以用来实现身份验证。
我是李超人
2020/08/21
4.6K0
grafana使用教程之API key
Oracle 19c给我的启示:RESTful API
最近Oracle发布了19c,而且随着Openworld的到来,官网也提前做了更新,打开Oracle官网,让我一脸懵逼,鼠标不知道该往哪儿点。
jeanron100
2019/09/29
4800
Oracle 19c给我的启示:RESTful API
[已解决] openai.error.AuthenticationError: No API key provided. You can set your API key in code using
在 Windows 系统中,设置环境变量有两种主要方法:通过系统属性设置和使用 PowerShell 或命令提示符。
Maynor
2023/10/17
1.1K0
[已解决] openai.error.AuthenticationError: No API key provided. You can set your API key in code using
Redis客户端API
client setName xx 为客户端设置名字 client list 列出与Redis服务端相连的所有客户端信息。 info 可查看Redis的所有信息。 info memory 只查看Redis内存使用情况。 info clients 记录了已连接客户端的信息
全栈程序员站长
2022/09/06
5770
Redis客户端API
如何获取Mathpix开发版的API key???
首先,公布一个好消息,Mathpix for Matlab 1.0.0版已经完成全部开发工作,就差最后调试工作,稍等几日即可与大家见面,先报个界面预览:
巴山学长
2021/02/24
2.8K0
如何获取Mathpix开发版的API key???
语音翻译api无法在线调试
在线调试的参数需要session Uuid和语音分片的序号 ,但是找不到预处理接口和文件分片上传接口,怎么搞啊 凑字数凑字数凑字数凑字数凑字数凑字数 凑字数凑字数凑字数凑字数凑字数凑字数 凑字数凑字数凑字数凑字数凑字数凑字数 凑字数凑字数凑字数凑字数凑字数凑字数 image.png
用户5798902
2019/07/18
4.3K0
语音翻译api无法在线调试
Kubernetes API Server的工作原理
Kubernetes API Server是Kubernetes集群中的主要组件之一,它负责处理来自用户和其他组件的请求,并提供对集群资源的操作和管理。
一凡sir
2023/09/04
2940
Kubernetes API Server的工作原理
点击加载更多

相似问题

从文本中获取值&将其赋值给变量

10

如何从列表中获取值并将其赋值给变量

10

如何从文本框中获取值,并使用TimeValue()将其赋值给变量

12

如何从JTable的多行中获取值并将其赋值给变量?

143

从Read命令中获取值,并将其赋值给变量

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文