go - 将数据从 Datastore 传递到 http.Writer
问题描述
我最近被介绍到称为go的语言的奇迹。我给自己设定了一项任务,即使用 GoLang 和 Google 的 Datastore 编写一个 RESTful API。我能够从 Datastore 检索数据并将其打印到控制台,fmt.Println
但是当我尝试使用 Datastore 中的数据并将其传递给http.Handler时,问题就出现了。
我想知道是否有人可以告诉我我哪里出错了,甚至可以指出我正确的方向。
这是我到目前为止所做的
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% 需要使用包装器,或者我只是在我的盘子中添加更多。
解决方案
我已经删除了它,return tasks, nil
因为它似乎是不必要的,修改了return, nil err
tolog.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 纠正我的格式错误。