首页 > 数据库 >chatgpt帮我创建一个由go+mysql+jwt+gorm搭建的restapi

chatgpt帮我创建一个由go+mysql+jwt+gorm搭建的restapi

时间:2023-05-10 10:37:01浏览次数:44  
标签:restapi jwt db user mysql go registerHandler gorm

好的,下面是一个简单的由go+mysql+jwt+gorm搭建的REST API示例:

首先,你需要创建一个新的Go模块。你可以使用如下命令来创建一个名为example的新模块:

go mod init example

接下来,你需要安装需要的依赖库,使用以下命令进行安装:

go get github.com/gorilla/mux

go get github.com/jinzhu/gorm

go get github.com/dgrijalva/jwt-go

准备工作完成之后,我们可以开始编写代码了。

首先,定义一个User结构体来表示用户对象:

type User struct {
    gorm.Model
    Name     string `json:"name"`
    Email    string `json:"email"`
    Password string `json:"password"`
}

在上述结构体中,我们使用了gorm.Model来自动创建“ID”、“CreatedAt”和“UpdatedAt”字段。我们还定义了三个其他字段:Name、Email和Password。

接下来,我们需要建立数据库连接,这里我们使用MySQL数据库。请确保在本地安装并运行该数据库,并创建用于访问数据库的用户。然后,输入以下代码连接到MySQL数据库:

func dbConnect() *gorm.DB {
    db, err := gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local")

    if err != nil {
        panic("failed to connect database")
    }

    db.AutoMigrate(&User{})

    return db
}

请注意,这里需要将user、password和dbname替换为你自己的MySQL数据库用户名、密码和数据库名称。

接下来,我们将定义处理HTTP请求的路由。我们使用gorilla/mux库来实现路由功能。输入以下代码:

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/register", registerHandler).Methods("POST")
    router.HandleFunc("/login", loginHandler).Methods("POST")

    log.Fatal(http.ListenAndServe(":8000", router))
}

在上述代码中,我们定义了两个路由:/register和/login。它们将分别映射到registerHandler和loginHandler函数。

接下来,我们来实现registerHandler和loginHandler函数。首先,让我们看一下其中一个函数的实现——registerHandler函数:

func registerHandler(w http.ResponseWriter, r *http.Request) {
    db := dbConnect()
    defer db.Close()

    var user User
    json.NewDecoder(r.Body).Decode(&user)

    if user.Name == "" || user.Email == "" || user.Password == "" {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintln(w, "Please provide all the details")
        return
    }

    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(user.Password), 8)
    user.Password = string(hashedPassword)

    db.Create(&user)

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "email": user.Email,
        "exp":   time.Now().Add(time.Hour * 24).Unix(),
    })

    tokenString, _ := token.SignedString([]byte("secret"))

    w.WriteHeader(http.StatusOK)
    fmt.Fprintln(w, tokenString)
}

在上述代码中,我们首先连接到数据库,并从HTTP请求的正文中解码用户信息。然后,我们检查用户是否提供了所有必要的细节——名称、电子邮件和密码。如果缺少任何一项,将返回400错误。

接下来,我们使用bcrypt库对用户提供的密码进行哈希。这是一种安全的方法,可以保护用户的密码不被黑客轻易破解。然后,我们将新用户存储到数据库中。

最后,我们创建一个JWT令牌并将其签名。此令牌将包含用户的电子邮件和过期时间。我们还将在响应正文中返回JWT令牌。

loginHandler函数的实现与registerHandler函数类似,但是它首先检查用户提供的凭据是否正确:

func loginHandler(w http.ResponseWriter, r *http.Request该问题涉及到的内容较多,需要分步骤来讲解如何使用go+mysql+jwt+gorm搭建rest api。

1.创建go模块
首先,需要在本地创建一个新的Go模块。在终端中使用以下命令:

```go mod init module_name```

其中,module_name是你想要为新模块命名的名称。

2.安装依赖包
接下来,需要安装必要的依赖库。使用以下命令:

```go get github.com/gorilla/mux```

```go get github.com/jinzhu/gorm```

```go get github.com/dgrijalva/jwt-go```

3.连接到MySQL数据库
在main.go文件中定义dbConnect函数以连接到MySQL数据库:

```go
func dbConnect() *gorm.DB {
    db, err := gorm.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database_name?charset=utf8&parseTime=True&loc=Local")

    if err != nil {
        panic("failed to connect database")
    }

    db.AutoMigrate(&User{})

    return db
}

请注意替换user、password和database_name为你自己的MySQL数据库用户名、密码和数据库名称。

4.路由设置
使用gorilla/mux库实现路由功能。在main.go文件中导入gorilla/mux库并在main函数中定义路由:

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/register", registerHandler).Methods("POST")
    router.HandleFunc("/login", loginHandler).Methods("POST")

    log.Fatal(http.ListenAndServe(":8000", router))
}

在上述代码中,我们定义了两个路由:/register和/login。它们将分别映射到registerHandler和loginHandler函数。

5.处理HTTP请求
实现registerHandler和loginHandler函数。以下是registerHandler函数的示例代码:

func registerHandler(w http.ResponseWriter, r *http.Request) {
    db := dbConnect()
    defer db.Close()

    var user User
    json.NewDecoder(r.Body).Decode(&user)

    if user.Name == "" || user.Email == "" || user.Password == "" {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintln(w, "Please provide all the details")
        return
    }

    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(user.Password), 8)
    user.Password = string(hashedPassword)

    db.Create(&user)

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "email": user.Email,
        "exp":   time.Now().Add(time.Hour * 24).Unix(),
    })

    tokenString, _ := token.SignedString([]byte("secret"))

    w.WriteHeader(http.StatusOK)
    fmt.Fprintln(w, tokenString)
}

在上述代码中,首先连接到数据库,并从HTTP请求正文中解码用户信息。然后,检查是否提供所有必要细节——名称、电子邮件和密码。如果缺少任何一项,则返回400错误。

接下来,使用bcrypt库对提供的密码进行哈希。这是一种安全的方法,可以保护用户的密码不被轻易破解。然后,将新用户存储到数据库中。

最后,创建JWT令牌并将其签名。此令牌将包含用户的电子邮件和过期时间。在响应正文中返回JWT令牌。

loginHandler函数的实现与registerHandler函数类似,但是它首先检查提供的凭据是否正确。

以上是一个简单的由go+mysql+jwt+gorm搭建的REST API示例,可以根据需求进行修改和扩展。

标签:restapi,jwt,db,user,mysql,go,registerHandler,gorm
From: https://www.cnblogs.com/zzzyt/p/17387195.html

相关文章

  • MySQL DROP TABLE
    DROPTABLE的堆栈#0row_drop_table_from_cache(tablename=0x7f7d580295b0"db/t",table=0x7f7d58008b20,trx=0x7f7e50c0b150)at/root/mysql-5.7.32/storage/innobase/row/row0mysql.cc:4179#10x00000000019fdb12inrow_drop_table_for_mysql(name=0x7f7d......
  • 如何进行MySQL源码调试(一条select语句的执行流程)
    一、背景MySQL是当今世上最受欢迎的使用最广泛的开源数据库,它的繁荣离不开它的开源特性。放在过去商业数据库的时代,大家都没有机会接触到数据库的源代码,但在如今开源数据库的时代,越来越多的人开始研究数据库的源码,并给社区贡献代码,MySQL官方每次发布新版本都要感谢一些在社区上贡......
  • MySQL(二十二)其他数据库日志(二)bin log二进制日志
    MySQL(二十二)其他数据库日志(二)binlog二进制日志binlog二进制日志binlog即binarylog,二进制日志,也叫做变更日志它记录所有更新数据的DDL和DML语句,但是不包含没有修改数据的语句(如Select、show等),以事件的形式记录保存在二进制文件中可以用于主从服务器之间的数据同步......
  • MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志
    MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志1MySQL支持的日志1.1日志类型慢查询日志:记录执行时间超过long_query_time的所有查询,方便我们对查询进行优化通用查询日志:记录所有连接的起始和终止时间,以及连接发送给数据库的所有指令,对复原操作的实际场景、发现问题......
  • Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Clas
      mybatis-plus生成的日期类型默认是localdatetime,数据库是datetime,按道理转换应该可以,我又不想把实体类转换成date查看依赖<--locadate/locadatetime的时间依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-ty......
  • KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比
    案例说明:相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点。适用版本:KingbaseESV8R6、MySQL8.0一、MySQL的排序规则1、排序规则(collation)排序规则是依赖于字符集,字符集是用来定义MySQL存储不......
  • KingbaseES 实现 MySQL 函数 last_insert_id
    用户从mysql迁移到金仓数据库过程中,应用中使用了mysql函数last_insert_id()来获取最近insert的那行记录的自增字段值。mysql文档中关于函数的说明和例子:LAST_INSERT_ID()如果没有参数,则LAST_INSERT_ID()返回一个BIGINTUNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语......
  • MySQL实现树形查询
    需要mysql8以上,5.7不支持  https://www.jianshu.com/p/f908aa35d448  CREATETABLE`perm_resource`(`resource_id`varchar(50)NOTNULLCOMMENT'资源ID',`resource_name`varchar(100)DEFAULTNULLCOMMENT'资源名称',`resource_parent_id`var......
  • mysql 去重分组后取每组时间最新的一条记录
    mysql去重分组后取每组时间最新的一条记录第一步:先分组后取到分组的那个id以及每个组最新的数据--先根据课程分组,然后在取这组统计数据中最先的日期selectCourseID,MAX(CountDate)asCountDate fromRep_school_class_course_count_data_cod......
  • JWT 生成token
      packagecom.landray.kmss.cmex.ssooauth.util;importio.jsonwebtoken.Claims;importio.jsonwebtoken.ExpiredJwtException;importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;importorg.apache.commons.lang.StringUtils;importjava.......