在我的Go应用程序中,我有这样的路线:
router.HandleFunc("/api/users_groups_relationship/{user_id:[0-9]+}", controllers.CreateUsersGroupsRelationship).Methods("POST")
我发出 POST 请求。在该请求的主体中,我发送了如下所示的JSON:
{
"groups": [1, 2, 3]
}
如您所见,groups
键具有ID数组作为值。用户可以分为几个组。我正在尝试向PostgreSQL数据库插入多个值。
如何获取请求正文中特定键的值?
还有其他最好的方法可以通过Go在数据库中插入多个值吗?
我的代码:
var CreateUsersGroupsRelationship = func(responseWriter http.ResponseWriter, request *http.Request) {
vars := mux.Vars(request)
userID := vars["user_id"]
fmt.Println(userID)
var groups []int
groups = request.Body("groups") // ???
for i := 1; i < len(groups); i++ {
fmt.Println(groups[i])
_, _ := database.DBSQL.Exec("INSERT INTO users_groups (user_id, group_id) VALUES ($1, $2);", userID, groups[i])
}
utils.ResponseWithSuccess(responseWriter, http.StatusOK, "All new records successfully created.")
}
答案 0 :(得分:2)
您可以为Request对象定义一个结构,然后将JSON解组到其中。
package main
import (
"fmt"
"github.com/gorilla/mux"
"net/http"
"encoding/json"
)
//Request is our request body.
type Request struct {
Groups []int `json:"groups"`
}
//JsonTest1 is the http handler.
func JsonTest1(w http.ResponseWriter, r *http.Request) {
req := new(Request)
//decode request to struct.
if err := json.NewDecoder(r.Body).Decode(&req); err != nil{
w.WriteHeader(400) //bad request
}
w.WriteHeader(200)
b, _ := json.Marshal(req)
w.Write(b)
w.Header().Set("Content-Type", "application/json; charset=utf-8")
}
func main(){
fmt.Printf("starting backend server\n")
root := mux.NewRouter()
root.HandleFunc("/foo", JsonTest1)
webServer := &http.Server{Addr: ":4000", Handler: root}
webServer.ListenAndServe()
}
如果您的身体很普通,也可以取消映射[string] interface {}的编组。
尝试
curl -XPOST -d '{"groups": [1]}' http://localhost:4000/foo