我在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”,最后是违规说明)?如何避免对此元数据客户端进行潜在的繁琐转换?
答案 0 :(得分:0)
您可以在我们的grpc / grpc Github回购中记录一个问题,以便我们可以更好地跟进那里吗?感谢。