GO RESful API (二)

继上一章,继续开始 "取经之路,就在眼前"

1.添加Post请求 & 解析json数据

上传数据到服务器

  • 附带json格式的body数据体
func RegisterHandler(write http.ResponseWriter,request *http.Request){
//解析请求数据

// 1.读取全部字节
data, _ := ioutil.ReadAll(request.Body)
log.Print("data=",string(data)) //data={"hello":"primer"}

// 2.定义保存的数据结构 json数据相当于是一个map
var m map[string]interface{} //需要使用interface,否则对于有些数据类型无法获得数据
_ = json.Unmarshal([]byte(string(data)), &m)
log.Print(m) //map[hello:primer]

// 3.响应数据
_, _ = write.Write([]byte(m["hello"].(string)))


}

知识扩展

  • curl命令: 文件上传 ,下载
  • get请求测试很简单: 直接在浏览器地址栏输入url
  • post请求需要使用 curl模拟真实请求
  • ​curl -X POST --data {"name":"primer"} http://xxx:8081/register​​y
  • 也可以模拟get请求 ​​curl GET http://xxx:8080/users​

2.添加数据库 & ORM

  • 使用映射数据库框架 ​​"/jinzhu/gorm"​
  • 该数据库使用的是 ​​sqlite3​
  • 创建模型
// 写入数据表实体类 用户表
type UserTable struct {
Name string
Password string
Createdtime time.Time
Updatedtime time.Time
Deletedtime time.Time
}
  • 数据库操作 <增 & 查>
func GetSqliteDb(dbName string) *gorm.DB{
db, err := gorm.Open("sqlite3", dbName)
if err != nil {
log.Fatal("数据库打开失败! 无法保存用户数据",err.Error())
return nil
}

return db;
}
func SaveUser(user modle.UserTable){
//1. 打开数据库
db := GetSqliteDb(config.USER_DB_NAME)
defer db.Close()

// 2.创建表
if !db.HasTable(modle.UserTable{}) {
db.CreateTable(&modle.UserTable{})
}

// 3.写入数据
db.Save(&user)
}
func ReadAllUser(db gorm.DB)[]modle.UserDao{
var result []modle.UserDao
// 读取数据
var users []modle.UserTable
db.Find(&users)
for i := 0 ; i < len(users); i++ {
result = append(result, modle.UserDao{users[i].Name, users[i].Password})
}

return result
}
func ReadUser(db gorm.DB,user modle.UserDao)modle.UserDao{
// 读取数据
var users []modle.UserTable
db.Where("name = ? AND password = ?",,user.Password).First(&users)
if len(users) == 0 {
return modle.UserDao{}
}
return modle.UserDao{
users[0].Name,
users[0].Password,
}
}
  • post请求 注册 & 登录查找
//   curl -X POST -d {\"name\":\"Primer\",\"password\":\"2464113103\"} http://localhost:8081/register
func RegisterHandler(write http.ResponseWriter,request *http.Request){
// 1.读取全部字节
data, _ := ioutil.ReadAll(request.Body)

// 2.定义保存的数据结构 json数据相当于是一个map
var user modle.UserDao
err := json.Unmarshal([]byte(string(data)), &user)
if err != nil {
log.Fatal("解析错误",err.Error())
_, _ = write.Write([]byte(string("注册失败\n"+err.Error())))
return
}

//写入数据库
var DbData = modle.UserTable {
,
user.Password,
time.Now(),
time.Now(),
time.Now(),
}
controller.SaveUser(DbData)

// 3.响应数据
_, _ = write.Write([]byte(string("注册成功")))
}

//curl -X POST -d {\"name\":\"LF\",\"password\":\"2464113103\"} http://localhost:8081/login
func LoginHandler(write http.ResponseWriter,request *http.Request){
data, _ := ioutil.ReadAll(request.Body)
log.Print("data=",string(data))
log.Print("data=",data)

var response modle.UserResponse
var user modle.UserDao
err := json.Unmarshal([]byte(string(data)), &user)
if err != nil {
response.Status = config.JSON_MARSHAL_ERROR
response.Result = false
response.Message = "服务端无法正确解析json字符串"
res, _ := json.Marshal(response)
_, _ = write.Write(res)
return
}

db :=controller.GetSqliteDb(config.USER_DB_NAME)
defer db.Close()
readUser := controller.ReadUser(*db, user)
if read == "" {
response.Status = config.USER_NOT_IN
response.Result = false
response.Message = "登陆失败"
res, _ := json.Marshal(response)
_, _ = write.Write(res)
return
}

log.Print("请求数据解析成功\n map=",user)
response.Status = config.OK
response.Result = true
response.Message = "登陆成功"
res, _ := json.Marshal(response)
_, _ = write.Write(res)
}

使用curl模拟post请求测试

GO RESful API (二)_数据库

​下一章,使用简陋的RESful结合Android实现 登录 & 注册​