Использование WithForwardResponseOption для преобразования вывода - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь изменить способ, которым 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.

...