在浏览器中显示Go App

时间:2016-03-12 02:41:18

标签: json go

我写了一个应用程序,它向API发出请求并获得JSON响应。当我运行应用程序时,它会在终端中显示json。

go run main.go

我想在浏览器中运行,我找到了这个,这让我可以在浏览器中打印一个字符串。

     func handler(w http.ResponseWriter, r *http.Request) {
       fmt.Fprintf(w, "This is a string")
   }

然后在main

http.HandleFunc("/", handler) 
log.Fatal(http.ListenAndServe("localhost:8000", nil))

现在我有一个字符串被打印到屏幕上,我有一个来自我正在使用的api的json响应,如何将json响应添加到浏览器而不是字符串?

最好将响应放入字符串然后将其带到浏览器中吗?

目前我正在将这样的json响应打印到终端

type Payload struct {
        Page    int
        Results []Data 
}

type Data struct {
        PosterPath       string  `json:"poster_path"`
        Adult            bool    `json:"adult"`
        Overview         string  `json:"overview"`
        ReleaseDate      string  `json:"release_date"`
        GenreIds         []int   `json:"genre_ids"`
        Id               int     `json:"id"`
        OriginalTitle    string  `json:"original_title"`
        OriginalLanguage string  `json:"original_language"`
        Title            string  `json:"title"`
        BackdropPath     string  `json:"backdrop_path"`
        Popularity       float64 `json:"popularity"`
        VoteCount        int     `json:"vote_count"`
        Video            bool    `json:"video"`
        VoteAverage      float64 `json:"vote_average"`
}

然后在main()里面我这样做,

    for i := 0; i < len(p.Results); i++ {
            fmt.Println(
            ImgUrl+p.Results[i].PosterPath, "\n", p.Results[i].Adult,
            p.Results[i].Overview, "\n", p.Results[i].ReleaseDate,
            p.Results[i].GenreIds, "\n", p.Results[i].Id,
            p.Results[i].OriginalTitle, "\n", p.Results[i].OriginalLanguage,
            p.Results[i].Title, "\n", ImgUrl+p.Results[i].BackdropPath,
            p.Results[i].Popularity, "\n", p.Results[i].VoteCount,
            p.Results[i].Video, "\n", p.Results[i].VoteAverage,
            )

构建Web应用程序的Go方法是什么?我的最终目标是获取用户输入并根据他们提供的信息重新创建我的api呼叫。

1 个答案:

答案 0 :(得分:1)

如果您可以直接将API的响应发送给您的用户,请使用io.Copy。您可以在将API转发给用户之前检查api请求是否成功,如果没有则发送错误。

某些API会在标题中发送信息,例如您如何处理速率限制。所以你可以在转发之前检查标题。

func handler(w http.ResponseWriter, r *http.Request) {
    resp, err := http.Get("http://jsonplaceholder.typicode.com/posts") // your request to the api

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

    if err == nil && resp.StatusCode == http.StatusOK {
        io.Copy(w, resp.Body)
    } else {
        json.NewEncoder(w).Encode(err)
    }
}

这可以避免在您的应用上进行任何新分配。

如果您想按照评论中的说明发送客户html,请使用html/template包。

您当然可以手动准备一个html字符串并将其发送给客户端。但我认为使用模板显然使代码更清晰,更易于维护。它还提供自动转换功能。

例如,以下内容会从Overview Results

呈现每个Payload的{​​{1}}部分
p