【笔记】Go语言 Http-client 解析json后并插入数据库

2023-11-10

一、Http - client 获取json

参考:Go标准库http Client的连接行为控制详解-原创手记-慕课网

因为

代码

resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...

等价于如下代码:

client := &http.Client{} // 自定义一个http客户端实例
resp, err := client.Get("http://example.com/")
...
resp, err := client.Post("http://example.com/upload", "image/jpeg", &buf)
...

注:别忘了在Get或Post成功后,调用defer resp.Body.Close()。

所以

根据上述代码,进行改进完成如下代码

res, err := http.Get("http://xxxxxxx")  //http网页自行准备
	if err != nil {
		// handle error
	}
	defer res.Body.Close()
	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		// handle error
	}
    //这时 body为int类型需强转为string类型
	body1 := string(body)
    fmt.Println(body1)
    

我的http json结构如下

 运行上述代码后,结果为

 获取json 成功

二、解析JSON

    ...
    body1 := string(body)
	var res2 Result
	errs := json.Unmarshal([]byte(body1), &res2)
	if errs != nil {
		fmt.Println("json unmarshal error:", errs)
	}

获取到的json 通过json.Unmarshal进行解析 并存入 res2中。

因为我的json结构为

 所以 需要进行两次data取值的操作

type Result struct {
	Message string `json:"message"`
	Code    int    `json:"code"`
	D       data   `json:"data"`
}

type data struct {
	Total int   `json:"total"`
	D1    data1 `json:"data"`
}

type data1 []struct {
	Id              int    `json:"id"`
	User            int    `json:"user"`
	Username        string `json:"username"`
}

使用如上定义后就可以取值

for i := 0; i < len(res2.D.D1); i++ {
		fmt.Printf("%v\n", res2.D.D1[i].ID)
        fmt.Printf("%v\n", res2.D.D1[i].User)
        fmt.Printf("%v\n", res2.D.D1[i].Username)        
}

三、创建sql库

create table jsontest ( 
    Num int primary key not null auto_increment, 
    id int not null, 
    user int not null, 
    username varchar(20)
)

碰到情况:username 设置char后无法插入,改为varchar(20)后可顺利插入数据

用 auto_increment 设置自增 Num 方便后续查看表数据

四、连接数据库,将解析后的json插入数据库

import (
	...
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

var db *sqlx.DB // 是一个连接池对象

func initDB() (err error) {
	//数据库信息
	//用户名:密码@tcp(ip:端口)/数据库名
	dsn := "root:xxx@tcp(192.xxx.xxx.xxx)/xxxx"   
	//连接数据库
	db, err = sqlx.Connect("mysql", dsn) //不会校验用户名和密码是否正确
	if err != nil {                      //dsn格式不正确的时候会报错
		return
	}
	db.SetMaxOpenConns(10) //设置数据库连接池的最大连接数
	db.SetMaxIdleConns(5)  //设置最大空闲连接数
	return
}

func main() {
    ...
    err1 := initDB()
    if err1 != nil {
		fmt.Printf("init DB failed, err :%v\n", err)
		return
	}
    for i := 0; i < len(res2.D.D1); i++ {
		ID := res2.D.D1[i].Id
		User := res2.D.D1[i].User
		Username := res2.D.D1[i].Username

        db.Exec(`insert into jsontest(id,user,username) values (?,?,?)`, ID, User, Username)
    }
    

按照上述代码即可完成插入数据的操作,运行后到数据库中查看结果

 插入成功!

接入数据库我使用的是sqlx进行操作。

五、sqlx注意事项

安装sqlx

go get github.com/jmoiron/sqlx

查询

查询单行

查询单条语句就用 db.Get
sqlStr1 := `select id, name, age from sqlxtest where id=1`
var u user
db.Get(&u, sqlStr1)
fmt.Printf("u:%#v\n", u)

查询多行

查询多条语句用 db.select
var userList = make([]user, 0, 10)
sqlStr2 := `select id,name, age from sqlxtest`
err = db.Select(&userList, sqlStr2)
if err != nil {
    fmt.Printf("select faile, err:%v\n", err)
    return
}
fmt.Printf("userList:%#v\n", userList)

插入、更新和删除

        均使用 db.Exec

插入

db.Exec(`insert into sqlxtest(id,name,age) values (?,?,?)`, id, name, age)

删除

db.Exec(`delete from sqlxtest where id = ?`, id)

更新

db.Exec(`update sqlxtest set age = ? where id = ?`, age, id)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【笔记】Go语言 Http-client 解析json后并插入数据库 的相关文章

随机推荐