gRPC PHP客户端HTTP标头

时间:2018-09-10 17:06:51

标签: php http-headers grpc

我试图在用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!)相同,尽管有人告诉我用户应该有权查看该资源。

我无权访问任何服务器日志来帮助进行那端的调试(尽管我试图访问它们-也许第二天就可以访问)。

任何帮助或指针将不胜感激。我已经为此工作了几天,感觉就像我已经尝试了所有可以想到的。

谢谢!

1 个答案:

答案 0 :(得分:0)

我可以通过在grpc.io Google组中提问来获得解决问题所需的信息。这是该线程: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();