Выполните функцию SparkCore, используя Gobot.io и сонный RESTful Framework for Go

У меня есть следующий фрагмент кода, в котором я использую инфраструктуру RESTful для Go, которая называется sleepy.

Я могу успешно запустить службу по адресу: http://localhost:3000/, однако, когда я пытаюсь получить доступ к http://localhost:3000/temperature, я ожидаю, что моя функция SparkCore dht выполнить.

Я использую платформу Gobot.io Spark для выполнения этой функции на основе этого примера, который я реализовал в своем собственном коде.

Проблема в том, что код не проходит gobot.Start() метод внутри Get() функция, поэтому я не могу вернуть result данные.

Я устанавливаю data значение, надеясь, что я могу сделать:

return 200, data, http.Header{"Content-type": {"application/json"}}

Но это никогда не называют из-за gobot.Start(),

Я очень новичок в Go, поэтому любая помощь будет принята с благодарностью.

package main

import (
    "net/url"
    "net/http"
    "fmt"
    "github.com/dougblack/sleepy"
    "github.com/hybridgroup/gobot"
    "github.com/hybridgroup/gobot/platforms/spark"
)

var gbot = gobot.NewGobot()
var sparkCore = spark.NewSparkCoreAdaptor("spark", "device_id", "auth_token")

type Temperature struct {}
func (temperature Temperature) Get(values url.Values, headers http.Header) (int, interface{}, http.Header) {
    work := func() {
        if result, err := sparkCore.Function("dht", ""); err != nil {
            fmt.Println(err)
        } else {
            data := map[string]string{"Temperature": result}
            fmt.Println("result from \"dht\":", result)
        }
    }

    robot := gobot.NewRobot("spark",
        []gobot.Connection{sparkCore},
        work,
    )

    gbot.AddRobot(robot)
    gbot.Start()

    return 200, data, http.Header{"Content-type": {"application/json"}}
}

func main() {
    api := sleepy.NewAPI()

    temperatureResource := new(Temperature)
    api.AddResource(temperatureResource, "/temperature")

    fmt.Println("Listening on http://localhost:3000/")
    api.Start(3000)
}

1 ответ

Решение

gbot.Start() это блокирующий вызов.

В этом контексте вы должны называть это как:

go gbot.Start() 

Это запустит его в goroutine (подумайте нить) и затем продолжит работу вашего приложения.

Когда вы смотрите на пример приложения gobot, они не работают в фоновом режиме, так как это основная функция. Если main запускает все в фоновом режиме и ничего не ждет, приложение завершается немедленно без видимого эффекта.

Другие вопросы по тегам