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))
}