我今天才刚刚开始学习GoLang,我正在尝试构建一个简单的Rest API Web服务器。
这是我希望将每个请求发送到Web服务器的响应结构:
package main type HttpResp struct{ Status int `json:"status"` Description string `json:"description"` Body string `json:"body"` }
这是我的 articles.go 文件,该文件具有获取数据库中所有文章的功能:
package main import ( "encoding/json" "net/http" "log" ) type Article struct{ Id string `json:"id"` Title string `json:"title"` Body string `json:"body"` Description string `json:"description"` } func AllArticles(w http.ResponseWriter, r *http.Request){ log.Print("/articles - GET") db := connect() defer db.Close() var articles []Article results, err := db.Query("SELECT * FROM Articles") if err != nil{ log.Print(err) return } for results.Next(){ var article Article err = results.Scan(&article.Title, &article.Description, &article.Body, &article.Id) if err != nil{ serr, _ := json.Marshal(err) json.NewEncoder(w).Encode(HttpResp{Status: 500, Description: "Failed to retrieve all articles", Body: string(serr)}) } articles = append(articles, article) } sarr, _ := json.Marshal(articles) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(HttpResp{Status: 200, Body: string(sarr)}) }
我在这里面临的问题是响应是这样的:
{“状态”:200,“描述”:“”,“正文”:“ [{\” id \“:\” 1 \“,\”标题\“:\”第一\“,\”正文\“ :\“这是一个测试主体\”,\“说明\”:\“这是一个测试\”}]“}
我希望正文只是JSON,而不是字符串。我该如何实现?
没有必要将 尸体 与 尸体 分开编组HttpResp。而是将Body字段的类型更改为interface{},然后将该字段设置为与json字符串相对的具体类型的任何值,例如[]Article,然后将resp编组一次。
HttpResp
Body
interface{}
[]Article
type HttpResp struct{ Status int `json:"status"` Description string `json:"description"` Body interface{} `json:"body"` }
其余的…
package main import ( "encoding/json" "net/http" "log" ) type Article struct{ Id string `json:"id"` Title string `json:"title"` Body string `json:"body"` Description string `json:"description"` } func AllArticles(w http.ResponseWriter, r *http.Request){ log.Print("/articles - GET") db := connect() defer db.Close() var articles []Article results, err := db.Query("SELECT * FROM Articles") if err != nil{ log.Print(err) return } for results.Next(){ var article Article err = results.Scan(&article.Title, &article.Description, &article.Body, &article.Id) if err != nil{ serr, _ := json.Marshal(err) json.NewEncoder(w).Encode(HttpResp{Status: 500, Description: "Failed to retrieve all articles", Body: string(serr)}) } articles = append(articles, article) } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(HttpResp{Status: 200, Body: articles}) }