如何使用mysql和mux在REST API中创建课程


package main
import (
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
)
type Course struct {
ID    string `json:"ID"`
Title string `json:"Title"`
}
var db *sql.DB
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the REST API!")
}

func createCourse(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
results, err := db.Prepare("INSERT INTO Courses VALUES (?)(?)") //course id and title
if err != nil {
panic(err)
}
reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
keyVal := make(map[string]string)
json.Unmarshal(reqBody, &keyVal)
title := keyVal["title"]
_, err = results.Exec(params["id"], title)
if err != nil {
panic(err)
}
fmt.Fprintf(w, "New post was created")
}
func main() {
var err error
db, err = sql.Open("mysql", "user:password@tcp(127.0.0.1:61876)/my_db")
// handle error
if err != nil {
panic(err.Error())
} else {
fmt.Println("Database opened")
}
defer db.Close()
// instantiate courses
router := mux.NewRouter()
router.HandleFunc("/api/v1/", home)
//router.HandleFunc("/api/v1/courses/{id}", createCourse).Methods("POST")
fmt.Println("Listening at port 5000")
http.ListenAndServe(":5000", router)
}

我想使用POST方法创建一个课程,但我不知道如何继续。现在我正在使用Mux和docker来创建我已经成功运行的sql。我知道有一种方法,我创建一个映射,做一个json.Unmarshal(reqbody,&map)和一个键值titlesql.Stmt.Exec。有没有办法使用params := mux.Vars(r)

添加了注释:我已经编辑了createCourse函数以包含params,并编辑了结构以包含ID。然而,我的createCourse功能没有按预期工作,我不知道如何继续。

要创建课程,请使用POST方法http请求,因为在RESTapi中,POST方法用于创建实体。将您的课程标题以json(或表单(的形式发送到请求主体中,并在您的服务中创建ID。您可以从Sql数据库获取增量ID。并发送该ID作为响应,然后Frontend可以使用该ID进行课程的未来更新。

使用如下json请求体,

{
"title": "mytitle"
}

并将其解组为下面的Struct类型。

type CreateCourseRequest struct {
Title string `json:"title"`
}

你可以在你的createCourse函数中解组请求,就像这个一样

reqBody, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
course := CreateCourseRequest{}
err = json.Unmarshal(reqBody, &course)
if err != nil {
//handle error here
}
title := course.title

最新更新