java — метаданные gRPC, прочитанные из ответа сервера, неправильно отформатированы

У меня есть приложение 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» и, наконец, описание нарушения)? Как я могу избежать потенциально утомительного преобразования этих метаданных на стороне клиента?

0

Решение

Не могли бы вы зарегистрировать проблему в нашем репозитории grpc / grpc Github, чтобы мы могли лучше следить за ней? Благодарю.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]