好的,下面是一个简单的由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