У меня есть приложение Java, работающее на Spring и определяющее несколько конечных точек gRPC. Эти конечные точки предназначены для запросов от нескольких клиентов, один из которых на PHP, поэтому я использовал PHP lib для gRPC. Теперь мне интересно, как правильно получить метаданные с сервера в случае недопустимого запроса, эти метаданные содержат в основном нарушения ограничений, созданные валидатором Java и преобразованные в коллекцию gRPC FieldViolation
объекты. В этом примере предполагается, что сервер возвращает одно единственное нарушение поля в качестве метаданных, с ключом «crimeKey» и описанием «violinDescription»:
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» и, наконец, описание нарушения)? Как я могу избежать потенциально утомительного преобразования этих метаданных на стороне клиента?
Не могли бы вы зарегистрировать проблему в нашем репозитории grpc / grpc Github, чтобы мы могли лучше следить за ней? Благодарю.
Других решений пока нет …