Как вставить несколько значений в базу данных - PullRequest
0 голосов
/ 07 марта 2019

В моем приложении Go у меня есть такой маршрут :

router.HandleFunc("/api/users_groups_relationship/{user_id:[0-9]+}", controllers.CreateUsersGroupsRelationship).Methods("POST")

Я делаю POST запрос.В теле этого запроса я посылаю такой JSON, который выглядит следующим образом:

{
    "groups": [1, 2, 3] 
}

Как видите, ключ groups имеет массив идентификаторов в качестве значения.Пользователь может быть в нескольких группах.Я пытаюсь вставить несколько значений в базу данных PostgreSQL.

  1. Как получить значение определенного ключа в теле запроса?

  2. Есть лилюбой другой лучший способ вставить несколько значений в базу данных с помощью 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.")
}

1 Ответ

2 голосов
/ 07 марта 2019

Вы можете определить структуру для объекта 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] {}.

Попробуйте с

curl -XPOST -d '{"groups": [1]}' http://localhost:4000/foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...