一、介绍

上一篇我们介绍过 go使用net/http库发送GET请求
本期介绍post请求。
post和get请求不同,主要在于 header部分,而net/http也帮我们封装了快捷的方式来发送post请求。
我们这里发生post请求,这里主要通过两种方式

http.Post()
DefaultClient.Do()

二、http.Post()的请求

2.1 json格式的post请求

func TestP1(t *testing.T) {
    url := "http://localhost:8080/v1/discovery"
    var contentType string
    contentType = "application/json"
    jsonBody := `{"id":"1010"}`
    resp, err := http.Post(url, contentType, bytes.NewReader([]byte(jsonBody)))
    if err != nil {

    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        // handle error
    }
    t.Log(string(body))
}

我们可以看一下http.Post()源码,底层调用的是 DefaultClient.Post()

func Post(url, contentType string, body io.Reader) (resp *Response, err error) {
    return DefaultClient.Post(url, contentType, body)
}

我们看一下 DefaultClient.Post()源码,底层调用的是
NewRequest(),以及DefaultClient.Do()

func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error) {
    req, err := NewRequest("POST", url, body)
    if err != nil {
        return nil, err
    }
    req.Header.Set("Content-Type", contentType)
    return c.Do(req)
}

因为我们要传入 Content-Type,最后还是调用了NewRequest(),来生成一个request,这样可以设置Header。


海生
104 声望33 粉丝

与黑夜里,追求那一抹萤火。