「goz」开源库,在Go中快速发起HTTP请求
2015 年 8 月 22 日
goz
是一个用于在Go代码中快速发起HTTP请求的开源库,
部分实现参考了PHP流行请求库: guzzle
安装
go get -u github.com/idoubi/goz 复制代码
文档
API 文档地址: godoc.org/github.com/…
基本使用
package main import ( "github.com/idoubi/goz" ) func main() { cli := goz.NewClient() resp, err := cli.Get("http://127.0.0.1:8091/get") if err != nil { log.Fatalln(err) } fmt.Printf("%T", resp) // Output: *goz.Response } 复制代码
查询参数
- map形式
cli := goz.NewClient() resp, err := cli.Get("http://127.0.0.1:8091/get-with-query", goz.Options{ Query: map[string]interface{}{ "key1": "value1", "key2": []string{"value21", "value22"}, "key3": "333", }, }) if err != nil { log.Fatalln(err) } fmt.Printf("%s", resp.GetRequest().URL.RawQuery) // Output: key1=value1&key2=value21&key2=value22&key3=333 复制代码
- 字符串形式
cli := goz.NewClient() resp, err := cli.Get("http://127.0.0.1:8091/get-with-query?key0=value0", goz.Options{ Query: "key1=value1&key2=value21&key2=value22&key3=333", }) if err != nil { log.Fatalln(err) } fmt.Printf("%s", resp.GetRequest().URL.RawQuery) // Output: key1=value1&key2=value21&key2=value22&key3=333 复制代码
提交数据
- form表单
cli := goz.NewClient() resp, err := cli.Post("http://127.0.0.1:8091/post-with-form-params", goz.Options{ Headers: map[string]interface{}{ "Content-Type": "application/x-www-form-urlencoded", }, FormParams: map[string]interface{}{ "key1": "value1", "key2": []string{"value21", "value22"}, "key3": "333", }, }) if err != nil { log.Fatalln(err) } body, _ := resp.GetBody() fmt.Println(body) // Output: form params:{"key1":["value1"],"key2":["value21","value22"],"key3":["333"]} 复制代码
- json数据
cli := goz.NewClient() resp, err := cli.Post("http://127.0.0.1:8091/post-with-json", goz.Options{ Headers: map[string]interface{}{ "Content-Type": "application/json", }, JSON: struct { Key1 string `json:"key1"` Key2 []string `json:"key2"` Key3 int `json:"key3"` }{"value1", []string{"value21", "value22"}, 333}, }) if err != nil { log.Fatalln(err) } body, _ := resp.GetBody() fmt.Println(body) // Output: json:{"key1":"value1","key2":["value21","value22"],"key3":333} 复制代码
请求头
cli := goz.NewClient() resp, err := cli.Post("http://127.0.0.1:8091/post-with-headers", goz.Options{ Headers: map[string]interface{}{ "User-Agent": "testing/1.0", "Accept": "application/json", "X-Foo": []string{"Bar", "Baz"}, }, }) if err != nil { log.Fatalln(err) } headers := resp.GetRequest().Header["X-Foo"] fmt.Println(headers) // Output: [Bar Baz] 复制代码
响应
cli := goz.NewClient() resp, err := cli.Get("http://127.0.0.1:8091/get") if err != nil { log.Fatalln(err) } body, err := resp.GetBody() if err != nil { log.Fatalln(err) } fmt.Printf("%T", body) // Output: goz.ResponseBody part := body.Read(30) fmt.Printf("%T", part) // Output: []uint8 contents := body.GetContents() fmt.Printf("%T", contents) // Output: string fmt.Println(resp.GetStatusCode()) // Output: 200 fmt.Println(resp.GetReasonPhrase()) // Output: OK headers := resp.GetHeaders() fmt.Printf("%T", headers) // Output: map[string][]string flag := resp.HasHeader("Content-Type") fmt.Printf("%T", flag) // Output: bool header := resp.GetHeader("content-type") fmt.Printf("%T", header) // Output: []string headerLine := resp.GetHeaderLine("content-type") fmt.Printf("%T", headerLine) // Output: string 复制代码
代理
cli := goz.NewClient() resp, err := cli.Get("https://www.fbisb.com/ip.php", goz.Options{ Timeout: 5.0, Proxy: "http://127.0.0.1:1087", }) if err != nil { log.Fatalln(err) } fmt.Println(resp.GetStatusCode()) // Output: 200 复制代码
超时
cli := goz.NewClient(goz.Options{ Timeout: 0.9, }) resp, err := cli.Get("http://127.0.0.1:8091/get-timeout") if err != nil { if resp.IsTimeout() { fmt.Println("timeout") // Output: timeout return } } fmt.Println("not timeout") 复制代码
项目信息
-
开源协议: MIT
-
Copyright (c) 2017-present, idoubi
-
项目主页: github.com/idoubi/goz
-
作者博客: idoubi.cc