Передача данных из хранилища данных в http.Writer - PullRequest
0 голосов
/ 27 января 2019

Меня недавно познакомили с чудесами языка, известного как go . Я поставил перед собой задачу написать RESTful API с использованием GoLang и Google Datastore. Я могу извлечь данные из Datastore и распечатать их на консоли, используя fmt.Println, однако проблема возникает, когда я пытаюсь использовать данные из Datastore и передать их в http.Handler . * 1006. *

Мне было интересно, может ли кто-нибудь сообщить мне, где я иду не так, или даже указать мне правильное направление.

Вот что я сделал до сих пор

 package main

 import (
    "log"
    "fmt"
    "context"
    "net/http"
 // "encoding/json"
    "cloud.google.com/go/datastore"
 )

 type Item struct {
      Id       string   `datastore:"id"`
      Name     string   `datastore:"title"`
      View     int      `datastore:"views"`
      Brand    string   `datastore:"brand"`
      id    int64   // interger from "Name/ID" fild in datastore entities list
 }

 func main() {
     http.HandleFunc("/", ListTasks)
     http.ListenAndServe(":8080", nil)
 }

 //func ListTasks(w http.ResponseWriter, r *http.Request) ([]*Item, error)     {
func ListTasks(w http.ResponseWriter, r *http.Request) {
    ctx := context.Background()

    client, err := datastore.NewClient(ctx, "my-client")
    if err != nil {
        log.Fatalln(err)
    }

    var tasks []*Item

    query := datastore.NewQuery("my-query")
    keys, err := client.GetAll(ctx, query, &tasks)
    if err != nil {
        return nil, err
    }

    for i, key := range keys {
        tasks[i].id = key.ID
    }

    return tasks, nil
}

Я также изучил http Wrappers, но не знаю, нужно ли использовать обертку на 100% или я просто добавляю больше на свою тарелку.

1 Ответ

0 голосов
/ 27 января 2019

Я удалил return tasks, nil, так как он показался ненужным, изменил return, nil err на log.Fatalln(nil, err), а также закодировал tasks в соответствии с инструкциями @ThunderCat и @tkausl. Моя проблема была решена, спасибо.

Вот мой рабочий код

package main

import (
    "log"
    "context"
    "net/http"
    "encoding/json"
    "cloud.google.com/go/datastore"
)

type Item struct {
    Id      string  `datastore:"id"`
    Name    string  `datastore:"title"`
    View    int     `datastore:"views"`
    Brand   string  `datastore:"brand"`
    id  int64   // interger from "Name/ID" fild in datastore entities list
}

func main() {
    http.HandleFunc("/", ListTasks)
    http.ListenAndServe(":8080", nil)
}

func ListTasks(w http.ResponseWriter, r *http.Request) {

    w.Header().Set("Content-Type", "application/json")

    ctx := context.Background()

    client, err := datastore.NewClient(ctx, "my-client")
    if err != nil {
        log.Fatalln(err)
    }

    var tasks []*Item

    query := datastore.NewQuery("my-query")
    keys, err := client.GetAll(ctx, query, &tasks)
    if err != nil {
        log.Fatalln(nil, err)
    }
    for i, key := range keys {
        tasks[i].id = key.ID
    }

    json.NewEncoder(w).Encode(tasks)
//  return tasks, nil
}

Теперь возвращает [{"Id":"24X660","Name":"Fiesta","View":129,"Brand":"Ford"}]

Также спасибо @static_cast за исправление моих ошибок форматирования.

...