GO RESful API (二)

本文详细介绍了如何使用GORESfulAPI进行Post请求处理及json数据解析,同时深入探讨了数据库操作,包括使用gorm框架与sqlite3数据库的交互,实现了用户数据的增删改查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/registery
    • 也可以模拟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请求测试

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值