php Guzzle源码,Golang仿PHP的Guzzle(二).md

简介

在开始封装 client 之前,我们先了解一下 go http client 对应发数据的方式。

query string

func query() {

url := "http://127.0.0.1:8888/query"

client := http.Client{}

req,err := http.NewRequest("GET",url,nil)

if err != nil {

log.Fatal(err)

}

q := req.URL.Query()

q.Add("id","1")

q.Add("name","王五")

q.Add("likes","数学")

q.Add("likes","体育")

req.URL.RawQuery = q.Encode()

res,err := client.Do(req)

if err != nil {

log.Fatal(err)

}

defer res.Body.Close()

io.Copy(os.Stdout,res.Body)

}

post (x-www-form-urlencoded)

func post() {

url := "http://127.0.0.1:8888/post"

client := http.Client{}

v := neturl.Values{}

v.Add("name","lisi")

v.Add("name","zs")

v.Set("age","10")

body := ioutil.NopCloser(strings.NewReader(v.Encode()))

req,err := http.NewRequest("POST",url,body)

if err != nil {

log.Fatal(err)

}

req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

res,err := client.Do(req)

if err != nil {

log.Fatal(err)

}

defer res.Body.Close()

io.Copy(os.Stdout,res.Body)

}

这种方式必须设置 req.Header.Set("Content-Type", "application/x-www-form-urlencoded") ,否则 server 将不能正常处理。

post (form-data)

func formdata() {

url := "http://127.0.0.1:8888/formdata"

client := http.Client{}

buffer := &bytes.Buffer{}

writer := multipart.NewWriter(buffer)

writer.WriteField("age","10")

writer.WriteField("author","李四")

writer.Close()

contentType := writer.FormDataContentType()

req,err := http.NewRequest("POST",url,buffer)

if err != nil {

log.Fatal(err)

}

req.Header.Set("Content-Type", contentType)

res,err := client.Do(req)

if err != nil {

log.Fatal(err)

}

defer res.Body.Close()

io.Copy(os.Stdout,res.Body)

}

核心是用 multipart.NewWrite() 去拼整个 form 。也是必须要设置 Content-Type 。

post (file)

func file() {

url := "http://127.0.0.1:8888/file"

client := http.Client{}

buffer := &bytes.Buffer{}

writer := multipart.NewWriter(buffer)

file := "/Users/purelightme/Desktop/default.jpg"

f,err := os.Open(file)

if err != nil {

log.Fatal(err)

}

defer f.Close()

_,path := filepath.Split(file)

w,_ := writer.CreateFormFile("pic",path)

io.Copy(w,f)

writer.Close()

contentType := writer.FormDataContentType()

req,err := http.NewRequest("POST",url,buffer)

if err != nil {

log.Fatal(err)

}

req.Header.Set("Content-Type", contentType)

res,err := client.Do(req)

if err != nil {

log.Fatal(err)

}

defer res.Body.Close()

io.Copy(os.Stdout,res.Body)

}

跟普通 form-data 差不多,就是把值从文本换成了文件。

json (xml,text......)

func json() {

url := "http://127.0.0.1:8888/json"

client := http.Client{}

data := []byte(`{"title":"水果"}`)

//data := []byte("1")

req,err := http.NewRequest("POST",url,bytes.NewBuffer(data))

if err != nil {

log.Fatal(err)

}

res,err := client.Do(req)

if err != nil {

log.Fatal(err)

}

defer res.Body.Close()

io.Copy(os.Stdout,res.Body)

}

直接通过 http.NewRequest() 的第三个参数传递,不需要设置 Content-Type ,json,xml,text 等都可以用这个方式传。

效果

93bbfbf90b26

29-1.png

有了这些基础,咱们就可以开始动手封装了。

下回继续分解~

2021-02-11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值