我写了一个应用程序,它向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呼叫。
答案 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