Как передать поток с grpc-сервера и как вернуть результат с goroutines grpc server-stream, чтобы передать результат в API - PullRequest
2 голосов
/ 13 мая 2019

У меня есть API, созданный через golang, который возвращает результат

{
   id : drone4
   item_parameter : {
       altitude : 20,
       longitude : 10.20
      latitude : 24.5
}

как результат json, но в коде он использует подпрограммы go, которые вызывают go func () для обработки результат от grpc-сервера golang

как это

go func() {
        fmt.Print("start getPosition loop")
        for {
            msg, err := stream.Recv() // msg UAVPosition
            if err == io.EOF {
                // read done.
                fmt.Print("start getPosition loop closed")
                close(position)
                return
            }
            if err != nil {
                log.Fatalf("Failed to receive getPosition : %v", err)
                close(position)
                return
            }
            log.Printf("Position point[%s](%f, %f, %f)", uavID.Aircraft, msg.Latitude, msg.Longitude, msg.Altitude)

            itemParameter := models.ItemParameter{
                Latitude:  msg.Latitude,
                Longitude: msg.Longitude,
                Altitude:  msg.Altitude,
            }

            position <- models.DronePosition{
                Name:          uavID.Aircraft,
                ItemParameter: itemParameter,
            }
        }
    }()

Мне нужно получить значение позиции, которое я использовал этот канал

position := make(chan models.DronePosition)

если есть шанс, как я могу получить этот результат для потоковой передачи в пользовательский интерфейс с помощью go? Любое предложение, как работать этот потоковый путь в пользовательском интерфейсе?

1 Ответ

3 голосов
/ 13 мая 2019

Если я вас правильно понял -> это конечная точка сервера grpc, и ваша проблема заключается в том, как отправить models.DronePosition обратно клиенту.Если это так, то у вас есть двунаправленная потоковая передача, и вы можете решить эту проблему следующим образом:

dronePosition := models.DronePosition{
                Name:          uavID.Aircraft,
                ItemParameter: itemParameter,
            }
position <- dronePosition
err = stream.Send(&dronePosition)

И на клиенте должно быть соответствующее обновление для поддержки двунаправленной потоковой передачи данных

...