发起HTTP请求

    Go 语言提供了 net/http 包,协助用户实施与 HTTP 协议相关的开发任务。该包既提供了 HTTP服务器 实现,又提供了 客户端 实现。

    本文介绍如何使用 包发起 HTTP 请求,覆盖大部分应用场景:

    发起 Get 请求是最常见的场景之一,使用 http.Get 函数即可。代码示例如下:

    10 行调用 函数发起 Get 请求;第 15 行在 main 函数结束时关闭 Body 对象;第 17 行读取整个响应体;第 23 行输出响应内容。

    警告

    Post请求

    发起 Post 请求的方式也是类似的,代码如下:

    1. package main
    2.  
    3. import (
    4. "fmt"
    5. "net/http"
    6. "io/ioutil"
    7. )
    8.  
    9. func main() {
    10. rsps, err := http.Post("http://example.com/", "plain/text", nil)
    11. if err != nil {
    12. fmt.Println("Request failed:", err)
    13. return
    14. }
    15. defer rsps.Body.Close()
    16.  
    17. body, err := ioutil.ReadAll(rsps.Body)
    18. if err != nil {
    19. return
    20. }
    21.  
    22. fmt.Println(string(body))
    23. }

    注意到, 函数接口与 http.Get 稍有区别,多了两个参数:

    • Content Type 头部,这里我们填 ;
    • 请求体,为 io.Reader 类型,没有请求体则填 ;

    超时设置需先准备一个 http.Client 结构体, Timeout 字段即是超时设置,单位为秒。之后调用结构体相关请求方法发起请求,示例代码片段如下:

    小技巧

    生产业务请务必设置超时时间,以免 goroutine 被超时请求劫持而停止响应。

    设置头部

    1. package main
    2.  
    3. import (
    4. "fmt"
    5. "net/http"
    6. "io/ioutil"
    7. "time"
    8. )
    9.  
    10. func main() {
    11. var client = &http.Client{
    12. Timeout: time.Second * 5,
    13. }
    14.  
    15. rqst, err := http.NewRequest("GET", "http://example.com", nil)
    16. if err != nil {
    17. fmt.Println("New request failed:", err)
    18. return
    19. }
    20. rqst.Header.Add("X-My-Auth", "xxxx")
    21.  
    22. rsps, err := client.Do(rqst)
    23. if err != nil {
    24. fmt.Println("Request failed:", err)
    25. return
    26. }
    27. defer rsps.Body.Close()
    28.  
    29. body, err := ioutil.ReadAll(rsps.Body)
    30. if err != nil {
    31. fmt.Println("Read body failed:", err)
    32. return
    33. }
    34.  
    35. fmt.Println(string(body))
    36. }

    15 行初始化 http.Request 结构体,指定请求方法, URL 以及请求体;第 21 行调用 Header 字段 Add 方法添加给定头部;第 23 行调用客户端 Do 方法发起请求。

    添加 Cookie 也是通过调用 http.Request 结构体方法完成,代码片段如下:

    1 行初始化 结构体;第 7 行调用 AddCookie 方法设置设置 Cookie ,参数为 结构体,只填充键值字段;

    Basic认证

    同样,进行 Basic 认证也需要操作 结构体。代码片段如下:

    1. rqst, err := http.NewRequest("GET", "http://example.com", nil)
    2. if err != nil {
    3. fmt.Println("New request failed:", err)
    4. return
    5. }
    6.  
    7. rqst.SetBasicAuth("user", "password")
    8.  
    9. rsps, err := client.Do(rqst)

    1 行初始化 http.Request 结构体;第 7 行调用 方法设置认证信息。

    小菜学编程

    参考文献