Я пытаюсь изменить способ, которым grpc-gateway выводит мои ответы. Мне удалось создать мои файлы * .pb.gw.go и настроить прокси-сервер. Однако есть большая разница в том, как мой REST API обрабатывает значения по сравнению с protobuff.
К сожалению, protobufs не может обрабатывать корневые массивы в JSON:
[ "Value1", "Value2", "Value3" ]
Для поддержки этого в gRPC мы отправляем значения обратно, завернутые в свойство «Значения». то есть:
{ "Values":[ "Value1", "Value2", "Value3" ]}
Я пытался добавить WithForwardResponseOption
к моему серверу Mux, чтобы обработать этот процесс. Я хотел бы сделать это в целом для ответов, потому что наши pbs структурированы последовательно, и это происходит довольно часто. До сих пор мне удалось определить, существуют ли значения в корне:
// Response transformer for rooted arrays
func responseTransformer(
ctx context.Context,
w http.ResponseWriter,
resp proto.Message,
) error {
if util.ReflectStructField(resp, "Values") == true {
... ... ...
}
return nil
}
К сожалению, я бы предпочел не использовать отражение здесь, но это единственный способ сделать это, не объявляя каждый маршрут, у которого есть свойство (которое часто меняется). В этот момент я застрял и не уверен, как получить свойство Values в структуре Message, сериализовать его и отправить обратно по сети, чтобы получить первый пример JSON.
Я понимаю, что это непростая задача, но я попал в странную ситуацию, когда мне приходится поддерживать совместимость API.