如何使用 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) 并执行键值titlesql.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 具有idtitle 的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 对象?

如何组织 gorilla mux 路线?

如何使用 React 从 DB 中删除数据,并点击我使用 php 和 mysql 创建的 rest API?

0710 mux协议的作用(ppp拨号时如何和gprs进行at指令交互)

Gorilla Mux 和 GORM 失败