可能是最像 requests 的 Golang 网络请求库

2019-12-04 21:36:03 +08:00
 winterssy

sreq 是一个简单、易用以及并发安全的 Golang 网络请求库,灵感来自 Python requestssreq 提供了 requests 风格的 API,让你可以像使用 requests 那样轻松高效地使用 net/http

发送请求

resp = requests.get('http://httpbin.org/get')
resp := sreq.Get("http://httpbin.org/get")

传递 URL 参数

payload = {
    'key1': 'value1',
    'key2': 'value2',
}
resp = requests.get('http://httpbin.org/get', params=payload)
payload := sreq.Params{
    "key1": "value1",
    "key2": "value2",
}
resp := sreq.Get("http://httpbin.org/get", sreq.WithQuery(payload))

响应内容

data = requests.get('http://httpbin.org/get').text
// ignore error
data, _ := sreq.Get("http://httpbin.org/get").Text()

二进制响应内容

data = requests.get('http://httpbin.org/get').content
// ignore error
data, _ := sreq.Get("http://httpbin.org/get").Content()

JSON 响应内容

data = requests.get('http://httpbin.org/get').json()
data := make(map[string]interface{})
// ignore error
_ = sreq.Get("http://httpbin.org/get").JSON(&data)

原始响应内容

data = requests.get('http://httpbin.org/get', stream=True).raw
// ignore error
data, _ := sreq.Get("http://httpbin.org/get").Raw()

定制请求头

headers = {
    'Referer': 'https://www.google.com',
}
resp = requests.get('http://httpbin.org/get', headers=headers)
headers := sreq.Headers{
    "Referer": "https://www.google.com",
}
resp := sreq.Get("http://httpbin.org/get", sreq.WithHeaders(headers))

更加复杂的 POST 请求

payload = {
    'key1': 'value1',
    'key2': 'value2',
}
resp = requests.post('http://httpbin.org/post', data=payload)
payload := sreq.Form{
    "key1": "value1",
    "key2": "value2",
}
resp := sreq.Post("http://httpbin.org/post", sreq.WithForm(payload))

上传文件

files = {
    'file': open('report.xls', 'rb'),
}
resp = requests.post('http://httpbin.org/post', files=files)
files := sreq.Files{
    "file": "report.xls",
}
resp := sreq.Post("http://httpbin.org/post", sreq.WithFiles(files))

发送 Cookies

cookies = {
    'name1': 'value1',
}
resp = requests.get("http://httpbin.org/get", cookies=cookies)
cookie := &http.Cookie{
    Name:  "name1",
    Value: "value1",
}
resp := sreq.Get("http://httpbin.org/get", sreq.WithCookies(cookie))

响应 Cookies

cookies = requests.get('https://www.xiami.com').cookies
// ignore error
cookies, _ := sreq.
    Get("https://www.xiami.com").
    Cookies()

更多用法可参阅:中文 Wiki 或者 API 文档

备注:sreq 不提供后向兼容保证,推荐在个人项目中使用。

5244 次点击
所在节点    分享创造
19 条回复
io123
2019-12-04 22:20:55 +08:00
前排支持大佬
ArJun
2019-12-04 22:22:56 +08:00
感觉用 go 的人越来越多了
co3site
2019-12-04 22:24:46 +08:00
看来得学学 Go 了
alexkkaa
2019-12-04 22:50:19 +08:00
requests 的强大不仅在于好用。而在于它对 http 标准的完美兼容和完善实现。再说动态语言的方便是静态语言无法比拟的
winterssy
2019-12-04 23:04:09 +08:00
@alexkkaa #4 所以没法完全复刻,只是 Golang 的 `net/http` 实在太难用了,要不然也不用重复造轮子。requests 是好用,但并不强大,在并发场景要逊色很多,aiohttp 倒不错,语法跟 requests 也很像。
ZSeptember
2019-12-05 12:01:43 +08:00
不错,很喜欢 option 这种设计,不知道有没有 middleware 这种机制,可以参考下 resty
superrichman
2019-12-05 13:06:35 +08:00
虽然我不用 go,但是提个问题:上传文件支持直接用内存里的数据吗?我看参数只有一个文件名。
winterssy
2019-12-05 13:20:49 +08:00
@superrichman #7 不是哈,是分块上传的,并且用了 os.Pipe,内存占用也比较低
winterssy
2019-12-05 13:24:50 +08:00
@ZSeptember #6 我看了下,resty 的 middleware 相当于请求 /响应拦截器,后续会加上,能否针对此功能提些建议?
superrichman
2019-12-05 15:32:14 +08:00
@winterssy 可能我没表述清楚。举个例子吧,比如我用程序读取了一个 excel 模版文件到内存里,然后往 excel 里面添加一些数据,这个时候我要把修改后的数据 post 出去但是不想在硬盘上写个临时文件。
winterssy
2019-12-05 15:43:42 +08:00
@superrichman #10 sreq 支持这样的功能,只不过由另外的 API 提供,而且不管是何种方式 sreq 都不会写临时文件。
winterssy
2019-12-05 16:32:44 +08:00
@ZSeptember #6 我在开发分支增加了你说的 middleware 机制,不知是否是你想要的?

<script src="https://gist.github.com/winterssy/098c1097294552c490699c4aa6e51b50.js"></script>
wnanbei
2019-12-06 10:12:19 +08:00
params 这些参数用 map[string]string 的话,是无法处理多个同名参数的问题的
winterssy
2019-12-06 11:09:22 +08:00
@wnanbei #13 感谢反馈,我已在最新的 commit 中修正此问题,这种情况下你只要调用多次 `sreq.WithQuery` 或者 `sreq.WithForm` 即可。
ZSeptember
2019-12-07 11:02:49 +08:00
@winterssy middleware 差不多就是这样的了。不过,你还有些东西没考虑到,压缩之类的。
winterssy
2019-12-07 14:13:41 +08:00
@ZSeptember #15 如果你不设置 Accept-Encoding 请求头的话,net/http 会自动解压缩,不知你指的场景是什么
ZSeptember
2019-12-07 14:36:41 +08:00
@winterssy 就是这个场景。这个,你就不能假定用户不设置这个 header 了。
abmin521
2019-12-07 14:54:57 +08:00
在搞一个 httpie 的 cli?
winterssy
2019-12-07 18:24:20 +08:00
@ZSeptember #17 v0.3.0 已加上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/626027

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX