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
-
使用映射数据库框架
"github.com/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.Name,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.Name, 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 readUser.Name == "" { 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请求测试