一架梯子,一头程序猿,仰望星空!

golang http客户端


golang 内置的net/http包,支持http客户端功能,我们可以用来处理http请求,请求api接口等等。

1.处理GET请求

使用http.Get函数处理get请求

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
    // 发起http GET请求
	resp, err := http.Get("http://api.baidu.com/user/info?id=1")
	if err != nil {
		// 处理错误
	}
	// 请求处理完后,需要记得释放body资源
	defer resp.Body.Close()
	
	// 使用ReadAll函数,读取http请求内容,返回的是字节数组
	content, _ := ioutil.ReadAll(resp.Body)
	
	// 打印http请求结果
	fmt.Println(string(content))
}

2.处理POST请求

发送post有两个函数常用函数:

  • PostForm - 发送表单,其实就是将content-type设置为application/x-www-form-urlencoded
  • Post - 发送post请求

使用PostForm的例子:

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
    // 发起http POST请求, 提交表单
    
    // 使用Values组织post请求参数
    params := url.Values{}
	params.Add("id", "1")
	params.Add("username", "tizi")
	params.Add("password", "123456")

    // PostForm请求自动将content-type设置为application/x-www-form-urlencoded
	resp, err := http.PostForm("http://api.baidu.com/user/creation", params)
	
	if err != nil {
		// 处理错误
	}
	// 请求处理完后,需要记得释放body资源
	defer resp.Body.Close()
	
	// 使用ReadAll函数,读取http请求内容,返回的是字节数组
	content, _ := ioutil.ReadAll(resp.Body)
	
	// 打印http请求结果
	fmt.Println(string(content))
}

Post函数和PostForm用法类似,下面例子暂时差异部分

// 组织post参数,因为post函数接受的是一个实现io.Reader接口的对象
// 这里我使用string reader组织字符串参数
data := strings.NewReader("username=tizi&password=1234")

// 第二个参数是content-type, 需要自己设置
// 第三个参数是post请求的参数,接受实现io.Reader接口的对象
resp, err := http.Post("http://api.baidu.com/user/creation","application/x-www-form-urlencoded", data)

3.设置请求头

如果我们要给http 请求设置header就需要另外的方式发送http请求

下面例子介绍如何为http请求设置请求头、http请求超时时间、设置cookie

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

func main() {
	// 初始化一个默认的http客户端
	client := http.DefaultClient
	// 设置请求超时时间为5秒
	client.Timeout = time.Second * 5

	// 使用Values组织post请求参数
	params := url.Values{}
	params.Add("id", "1")
	params.Add("username", "tizi")
	params.Add("password", "123456")

	// 创建http请求, 因为NewRequest的请求参数,接受的是io.Reader,所以先将Values编码成url参数字符串,
	// 然后使用strings.NewReader转换成io.Reader对象
	req, _ := http.NewRequest("POST", "http://api.baidu.com/user/info", strings.NewReader(params.Encode()))

	// 设置请求头(header)
	req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Add("Site", "www.tizi365.com")
	
	// 设置cookie
	// 初始化cookie对象
	cookie := http.Cookie{}
	cookie.Name = "tizi-domain" // cookie名字
	cookie.Value = "tizi365.com" // cookie值
	cookie.Path = "/" // cookie 路径
	//cookie有效期为3600秒
	cookie.MaxAge = 3600
	
	// 为请求添加cookie
	req.AddCookie(&cookie)

    // 使用http客户端发送请求
	resp, err := client.Do(req)
	if err != nil {
		//请求错误处理
	}

	// 处理完请求后需要关闭响应对象的body
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}