【问题标题】:gRPC PHP client HTTP headersgRPC PHP 客户端 HTTP 标头
【发布时间】:2018-09-10 17:06:51
【问题描述】:

我正在尝试在用 PHP 编写的 gRPC 客户端调用中设置一些 HTTP 标头。我已经阅读了我能找到的关于 gRPC 的 PHP 实现的所有文档,但找不到任何指定如何在 PHP 中执行此操作的内容。通过阅读其他语言的文档,我开始认为标头是在客户端元数据中指定的。但是,我找不到任何关于如何在 php 中格式化这些格式的信息,而且我尝试的所有格式似乎都不起作用。这是我当前的代码:

$options = [
  'credentials' => $this->credentialsObject,
  'update_metadata' => function($metaData){
    $metaData['headers'] = ['Authorization' => 'Bearer ' . $this->token];
    return $metaData;
  }
];

$client = new OrganizationServiceClient($this->url,$options);

$r = new \Google\Protobuf\GPBEmpty();
list($data,$status) = $client->list($r)->wait();

我得到的响应与我根本没有设置授权标头 (Access Denied!) 相同,尽管我被告知我的用户应该有权查看该资源。

我无权访问任何服务器日志来帮助进行调试(尽管我正在尝试访问它们 - 可能在第二天就可以访问)。

任何帮助或指针将不胜感激。我已经为此工作了几天,感觉我已经尝试了我能想到的一切。

谢谢!

【问题讨论】:

    标签: php http-headers grpc


    【解决方案1】:

    我能够通过在 grpc.io 谷歌组中提问来获得解决问题所需的信息。这是该线程:https://groups.google.com/forum/#!searchin/grpc-io/php%7Csort:date/grpc-io/p4-P78_EOyY/pHHR6Q5OBwAJ

    解决方案的要点是 gRPC 使用 HTTP2(因此不同的标头语法),元数据等同于标头。下面是我更新的代码。这是重要的一行$metaData['authorization'] = ['Bearer ' . $this->token];。请注意,$metaData 数组键与 HTTP2 标头键相同,其值为 一个数组,其中包含标头值作为字符串。

    $options = [
      'credentials' => $this->credentialsObject,
      'update_metadata' => function($metaData){
         $metaData['authorization'] = ['Bearer ' . $this->token];
         return $metaData;
      }
    ];
    
    $client = new OrganizationServiceClient($this->url,$options);
    
    $r = new \Google\Protobuf\GPBEmpty();
    list($data,$status) = $client->list($r)->wait(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-05
      • 2017-01-19
      • 2011-05-20
      • 1970-01-01
      • 2017-03-20
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多