go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求
2019-07-22 17:25
295 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/KongYu01/article/details/96855725
go语言学习第八天==》mysql数据库增删改查、用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求
- 引包
import的作用是引包,当引入包时,该包下文件的所有init()函数都会被执行,并且可以使用该包下的所有函数
当使用"_"符号时表示只执行包内init()函数 不引入包名内的其他函数
import ( "database/sql" //注意看如上对"_"符号的描述 _ "github.com/go-sql-driver/mysql" )
- 连接数据库函数
注:open在执行时只设置连接参数,没有真正连接数据库
只在实际操作时才真正连接数据库
sql.open(驱动名,数据源dsn)(*DB,err) //即(其中[]内表示可选) sql.open(驱动名,“用户名:密码@[连接方式](主机:端口号)/数据库名[?参数=值]”) //举列 db,err:=sql.open("mysql","root:tiger@(127.0.0.1:3306)/test")
查询:
rows, _ := db.Query("select * from ...");
查询单行
rows, _ := db.QueryRow("select * from ...");
曾删改
rows,_:=db.Exec(...)
预处理语句
stmt,_:=db.Prepare("select * from userinfo where username=?")
demo:
使用预处理语句的增删改查
package main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) //定义结构体用于存储查询到的行数据信息 type userinfo struct{ Id int16 Username string Age int16 } func main(){ //设置连接参数 db,_:=sql.Open("mysql","root:tiger@(127.0.0.1:3306)/test") defer db.Close() var uu userinfo username:="aaa" ///////////////////////////////查询 stmt,_:=db.Prepare("select * from userinfo where username=?") rows,_:=stmt.Query(username) for rows.Next(){ //Scan里面的参数个数必须和查询得到的行内数据个数一致 //比如rows.Scan(&uu.Id,&uu.Username)将取不到值 rows.Scan(&uu.Id,&uu.Username,&uu.Age) fmt.Println(uu.Id,uu.Username,uu.Age) } ///////////////////////////// 增加 // 上面定义过stmt所以不用:= stmt,_=db.Prepare("insert into userinfo values(?,?,?)") uu.Id=98 uu.Username="block" uu.Age=98 ret,_:=stmt.Exec(uu.Id,uu.Username,uu.Age) //获取影响的行数 ins_nums,_:=ret.RowsAffected() fmt.Println("增加数据影响行数",ins_nums) //////////////////////////删除 stmt,_=db.Prepare("delete from userinfo where username=?") uu.Username="block" //上面定义过ret所以不用:= ret,_=stmt.Exec(uu.Username) ins_nums,_=ret.RowsAffected() fmt.Println("删除数据影响行数",ins_nums) //////////////////////////修改 stmt,_=db.Prepare("update userinfo set age=? where username=?") uu.Username="ttt" uu.Age=999 ret,_=stmt.Exec(uu.Age,uu.Username) ins_nums,_=ret.RowsAffected() fmt.Println("修改数据影响行数",ins_nums) ///////////////////////////批量增加 stmt,_=db.Prepare("insert into userinfo values(?,?,?)") /* u1:=userinfo{ Id: 6, Username: "kkk", Age: 777, } u2:=userinfo{ 7, "kkk", 777, } us:=[2]userinfo{u1,u2} */ //或者这样初始化 us:=[2]userinfo{ { 66, "kkk", 777, }, { 77, "kkk", 777, }, } for _,u :=range us{ ret,_=stmt.Exec(u.Id,u.Username,u.Age) ins_nums,_=ret.RowsAffected() fmt.Println("增加数据影响行数",ins_nums) } }
- 发起http请求
1发起http的get请求
原型
func (c *Client) Get(url string) (r *Response, err error)
package main import ( "io/ioutil" "fmt" "net/http" "log" "encoding/json" ) func main(){ resp, err := http.Get("http://127.0.0.1:8888/test") if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } /////////////////////////////// //如果返回为json数据则可以进行json解析 //这里解析为map myMap := make(map[string]interface{}) // json.Unmarshal([]byte(jsonBuf), &m1) json.Unmarshal(body, &myMap) fmt.Println(myMap) //////////////////////////////////// fmt.Println(string(body)) }
2发起post请求
原型
参数为:请求地址、将要 POST 数据的资源类型(MIMEType)、数据的比特流([]byte形式)
func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err error)
//第二个参数要设置成”application/x-www-form-urlencoded”,
//否则post参数无法传递
package main import ( "io/ioutil" "fmt" "net/http" "log" "encoding/json" "strings" ) func main(){ //第二个参数要设置成”application/x-www-form-urlencoded”, //否则post参数无法传递 //传图片使用 //resp, err := http.Post("http://example.com/upload", "image/jpeg", &imageDataBuf) resp, err := http.Post("http://127.0.0.1:8888/test", "application/x-www-form-urlencoded", strings.NewReader("qqq=aaa")) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } /////////////////////////////// //如果返回为json数据则可以进行json解析 //这里解析为map myMap := make(map[string]interface{}) // json.Unmarshal([]byte(jsonBuf), &m1) json.Unmarshal(body, &myMap) fmt.Println(myMap) //////////////////////////////////// fmt.Println(string(body)) }
3发起 PostForm(也属于post请求)
原型
参数:地址、请求参数
不用指定application/x-www-form-urlencoded
func (c *Client) PostForm(url string, data url.Values) (r *Response, err error)
package main import ( "io/ioutil" "fmt" "net/http" "log" "encoding/json" "net/url" ) func main(){ resp, err := http.PostForm("http://127.0.0.1:8888/test", url.Values{"key1": {"Value1"}, "key2": {"value2"}}) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } /////////////////////////////// //如果返回为json数据则可以进行json解析 //这里解析为map myMap := make(map[string]interface{}) // json.Unmarshal([]byte(jsonBuf), &m1) json.Unmarshal(body, &myMap) fmt.Println(myMap) //////////////////////////////////// fmt.Println(string(body)) }
4发起Head请求
原型
只有一个参数,就不剧烈了
func (c *Client) Head(url string) (r *Response, err error)
5发起do请求
原型
如果要发起的请求需要设置头参数,cookie之类的数据就用此方法
参数:设置好的请求参数
func (c *Client) Do(req *Request) (resp *Response, err error)
demo
package main import ( "io/ioutil" "fmt" "net/http" "encoding/json" "strings" ) func main(){ client := &http.Client{} ///////////////////////////////////// ///设置一系列请求参数 req, err := http.NewRequest("POST", "http://127.0.0.1:8888/test", strings.NewReader("aaa=bbb")) if err != nil { // 错误处理 } //设置请求类型为参数 req.Header.Set("Content-Type", "application/x-www-form-urlencoded") //设置Cookie头 req.Header.Set("Cookie", "aaa=bbb") //发起请求 resp, err := client.Do(req) /////////////////////////////////////// defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error } /////////////////////////////// //如果返回为json数据则可以进行json解析 //这里解析为map myMap := make(map[string]interface{}) // json.Unmarshal([]byte(jsonBuf), &m1) json.Unmarshal(body, &myMap) fmt.Println(myMap) //////////////////////////////////// fmt.Println(string(body)) }
相关文章推荐
- [c#][Windows 10 | Windows 10 mobile | Windows Phone] HttpClient 实现form-data POST上传请求
- HttpClient发起GET / POST请求
- 关于web程序调试相关工具谷歌访问助手,和测试 POST 请求客户端工具,Advanced REST Client的下载和安装
- HttpClient发起GET或者POST请求
- 利用HttpClient的POST方式发起带参数的请求时,点击注册按钮无反应状态分析
- java apache commons HttpClient发送get和post请求的学习整理
- java apache commons HttpClient发送get和post请求的学习整理
- java apache commons HttpClient发送get和post请求的学习整理
- AJAX学习笔记之 客户端请求方式 get 和post 模式
- java apache commons HttpClient发送get和post请求的学习整理(转)
- java apache commons HttpClient发送get和post请求的学习整理
- go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置
- java apache commons HttpClient发送get和post请求的学习整理
- java apache commons HttpClient发送get和post请求的学习整理
- java apache commons HttpClient发送get和post请求的学习整理
- HttpClient发起post请求
- httpClient发送post请求
- HttpClient get和post请求的示例代码以及防乱码处理
- python 抓http GET POST 客户端请求包(关键的是规则)