goreq: 极简单的流式golang http client

goreq是一个极其简单的流式golang http client。它是我寻找类似Java OKHttp库的golang http client库时创建的。
最原始的代码fork自gorequest,它实现了Node.js库SuperAgent类似的功能。但是gorequest有一些bug没有fix,用户也提出了一些新的特性没有支持。
我重构了代码,更正了一些bug,增加了新的特性,尤其是POST BODY现在可以支持任意类型, 不再局限于json或者form字符串格式。 因为改动比较大,不好提交pull requests,干脆创建了一个新的轮子。这就是这个项目的最初目的。

比如下面调用baidu API根据IP地址获取地理信息的例子:

1
2
3
4
5
headers := `{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Referer":"http://developer.baidu.com/map/index.php?title=webapi/ip-api"}`
_, body, _ := goreq.New().SetHeaders(headers).Get("http://api.map.baidu.com/location/ip?ak=E4805d16520de693a3fe707cdc962045&ip=202.198.16.3&coor=bd09ll").End()

支持的HTTP METHOD

支持 GET, POST, HEAD, PUT, DELETE, PATCH 等http method,而且都想HTTP GET一样简单, 比如下面的HTTP PUT:

1
2
_, body, _ := goreq.New().Put("http://httpbin.org/put").SendRawString("hello world").End()
println(body)

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"args": {},
"data": "hello world",
"files": {},
"form": {},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "11",
"Content-Type": "text/plain",
"Host": "httpbin.org",
"User-Agent": "Go-http-client/1.1"
},
"json": null,
"origin": "117.121.34.13",
"url": "http://httpbin.org/put"
}

Request Body及Header

发送一个JSON格式的内容也很简单, 你可以传入一个struct, GoReq自动将它转为一个JSON字符串。

1
_, body, _ := goreq.New().Put("http://httpbin.org/put").SendMapString("name=Baymax&password=12345678").End()

注意在这种情况下(设置了body,未设置Content-Type), Content-Type为application/json
甚至你可以传递一个查询字符串:

1
_, body, _ := goreq.New().Put("http://httpbin.org/put").ContentType("json").SendMapString("name=Baymax&password=12345678").End()

注意在这种情况下(设置了body,未设置Content-Type), Content-Type为application/x-www-form-urlencoded。所以这里显示地设置为"application/json"

Proxy和超时

可以为读写设置一个超时时间:

1
2
_, _, err := goreq.New().Get("http://httpbin.org//delay/100").Timeout(10 * time.Second).End()
println(err[0].Error())

Basic Auth

GoReq支持Basic Auth身份验证:

1
_, body, _ := goreq.New().Get("http://httpbin.org/basic-auth/Baymax/12345678").SetBasicAuth("Baymax", "12345678").End()

更多的例子和文档请查看 godoc

评论