从服务器响应中读取的gRPC元数据格式错误

时间:2018-02-07 13:34:13

标签: java php grpc

我在Spring上运行Java应用程序并定义了多个gRPC端点。这些端点是从多个客户端查询的,其中一个是PHP,因此我将PHP库用于gRPC。现在我想知道如果请求无效,如何正确地从服务器获取元数据,这个元数据主要包含由Java验证器构建的约束违规并转换为gRPC FieldViolation对象的集合。在此示例中,服务器应该返回一个字段违例作为元数据,其中包含密钥“violationKey”和描述“violationDescription”:

try {
    // doStuff
} catch (ConstraintViolationException e) {
    Metadata trailers = new Metadata();
    trailers.put(ProtoUtils.keyForProto(BadRequest.getDefaultInstance()), BadRequest
            .newBuilder()
            .addFieldViolations(FieldViolation
                .newBuilder()
                .setField("violationKey")
                .setDescription("violationDescription")
                .build()
            )
            .build()
        );

    responseObserver.onError(Status.INVALID_ARGUMENT.asRuntimeException(trailers));
}

在PHP方面,这是检索元数据的实现:

class Client extends \Grpc\BaseStub
{
    public function callService()
    {
        $call = $this->_simpleRequest(
            'MyService/MyAction',
            $argument,
            ['MyActionResponse', 'decode'],
            $metadata, $options
        );

        list($response, $status) = $call->wait();
        var_dump($status->metadata);    // A
        var_dump($call->getMetadata()); // B
    }
}

结果:“A”输出一个空数组,“B”输出正确的元数据,格式如下:

array(1) {
  ["google.rpc.badrequest-bin"]=>
  array(1) {
    [0]=>
    string(75) "
I
testALicense plate number is not in a valid format for country code FR"
  }
}

为什么状态中的元数据为空,为什么$call->getMetadata()检索到的元数据的格式是这样(“I”后跟违规键,然后是“A”,最后是违规说明)?如何避免对此元数据客户端进行潜在的繁琐转换?

1 个答案:

答案 0 :(得分:0)

您可以在我们的grpc / grpc Github回购中记录一个问题,以便我们可以更好地跟进那里吗?感谢。