如何使用 mysql 和 mux 在 REST API 中创建课程?
Posted
技术标签:
【中文标题】如何使用 mysql 和 mux 在 REST API 中创建课程?【英文标题】:How do you create a course in a REST API using mysql and mux? 【发布时间】:2021-05-21 16:50:00 【问题描述】: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 方法创建课程,但我不知道如何继续。现在我正在对我成功运行的 sql 使用 Mux 和 docker。我知道有一种方法可以创建地图并执行json.Unmarshal(reqbody,&map)
并执行键值title
的sql.Stmt.Exec
。有没有办法使用params := mux.Vars(r)
做到这一点?
添加了 cmets:我已编辑 createCourse 函数以包含参数和包含 ID 的结构。但是,我的 createCourse 函数没有按预期工作,我不确定如何继续。
【问题讨论】:
【参考方案1】:要创建课程,请使用 POST 方法 http 请求,因为在 REST apis 中,使用 POST 方法创建实体。在请求正文中以 json(或表单)的形式发送您的课程标题,并在您的服务中创建 ID。您可以从 Sql 数据库中获取增量 ID。并发送该 ID 作为响应,然后前端可以使用该 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
【讨论】:
感谢您的快速回复。我已经编辑了我的 CreateCourse 函数以包含参数和包含 ID 的结构。但是,我的 createCourse 函数没有按预期工作,我不知道如何继续。/api/v1/courses/id
在此路径中,如果api/vi/courses/123
是您的路径,则您可以获得params["id"]
,然后是params["id"] = 123
,但是您没有从参数中获得title
,因为您没有获得它从你的路径。你能解释一下你的真实网址路径吗?你好id
和title`?
以前我使用的课程 struct
只有 title string
,所以我使用 params["course_title"] 代替。但我决定更改Course table
具有id
和title
的sql 表。所以现在我使用`router.HandleFunc("/api/v1/courses/id", createCourse).Methods("POST")` 和params["id"]
我用它而不是params["title"]
我已经编辑了答案,如果您对此有任何疑虑,请咨询以上是关于如何使用 mysql 和 mux 在 REST API 中创建课程?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gorilla Mux 端点通过 HTTP 流式传输数据
如何使用 MySQL 在 Spring Boot REST API 中放置和获取任何格式的 JSON 对象?
如何使用 React 从 DB 中删除数据,并点击我使用 php 和 mysql 创建的 rest API?