Golang仿PHP的Guzzle(二).md

PurelightM_d697 · · 1164 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简介

在开始封装 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("<xml><id>1</id></xml>")

    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 等都可以用这个方式传。

效果

源码:client.go

29-1.png

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

下回继续分解~

2021-02-11


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:PurelightM_d697

查看原文:Golang仿PHP的Guzzle(二).md

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1164 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传