Z
I couldn't give the exact answer that you're not working. So I decided to give you an example.create a table with userscreate table users
(
id int
constraint users_pk
primary key,
name varchar(32),
age int
);
All the work code.package main
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
_ "github.com/lib/pq"
)
type User struct {
Id int json:"id"
Name string json:"name"
Age int json:"age"
}
func JSONError(w http.ResponseWriter, err error, bcode string, code int) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff")
w.WriteHeader(code)
// nolint: errcheck
json.NewEncoder(w).Encode(struct {
Code string
Message string
}{
Code: bcode,
Message: err.Error(),
})
}
func (u *User) Save() {
// connect...
connStr := "user=user password=password dbname=metrics sslmode=disable port=5432 host=localhost"
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err)
}
defer db.Close()
// добавление...
// returning id вернет нужный ID для этого row.
// так уж получилось, что я сам задаю этот ID. но вы можете использовать автоинкримент
lastInsertId := 0
err = db.QueryRow("insert into users (id, name, age) values ($1, $2, $3) returning id",
u.Id, u.Name, u.Age).Scan(&lastInsertId)
if err != nil {
panic(err)
}
}
func (u *User) List() []User {
// connect...
connStr := "user=user password=password dbname=metrics sslmode=disable"
db, err := sql.Open("postgres", connStr)
if err != nil {
panic(err)
}
defer db.Close()
rows, err := db.Query("select * from users")
if err != nil {
panic(err)
}
defer rows.Close()
users := []User{}
// просмотр строк...
for rows.Next() {
u := User{}
err := rows.Scan(&u.Id, &u.Name, &u.Age)
if err != nil {
fmt.Println(err)
continue
}
users = append(users, u)
}
for _, u := range users {
fmt.Println(u.Id, u.Name, u.Age)
}
return users
}
func myHandler(rw http.ResponseWriter, request *http.Request) {
var user User
err := json.NewDecoder(request.Body).Decode(&user)
if err != nil {
JSONError(rw, fmt.Errorf("cannot unmarshal user: %w", err), "custom_code", http.StatusUnprocessableEntity)
return // завершаем выполнение
}
user.Save()
listOfAllUsers := user.List()
response := struct {
Users []User
}{
listOfAllUsers,
}
err = json.NewEncoder(rw).Encode(&response)
if err != nil {
// тут уже вам решать, что сделать надо
JSONError(rw, fmt.Errorf("cannot unmarshal response: %w", err), "custom_code2", http.StatusInternalServerError)
return
}
// запишем новый статус в ответ.
rw.WriteHeader(http.StatusCreated)
// а если дошли сюда - это значит, что все хорошо. завершаем
}
func main() {
http.HandleFunc("/users", myHandler)
http.ListenAndServe(":8080", nil)
}
Start the app and test.➜ ~ curl -X POST 'http://127.0.0.1:8080/users'
-H 'Content-Type: application/json'
--data-raw '{
"id": 56,
"name": "user56",
"age": 156
}' | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 234 100 180 100 54 3600 1080 --:--:-- --:--:-- --:--:-- 4680
{
"Users": [
{
"id": 1,
"name": "user1",
"age": 10
},
{
"id": 2,
"name": "user1",
"age": 10
},
{
"id": 3,
"name": "user1",
"age": 10
},
{
"id": 5,
"name": "user5",
"age": 15
},
{
"id": 56,
"name": "user56",
"age": 156
}
]
}