golang requests库更新了,使用方法如下

栏目: Python · 发布时间: 5年前

内容简介:golang 自带的net/http功能已经非常完善。它和python里面的urllib系列库一样,功能足够,但是使用起来非常繁琐。python版本的requests简直就是神器,让很多人非常敬仰。

requests

requests 是一个用golang 语言clone python版本的requests库。

golang 自带的net/http功能已经非常完善。它和 python 里面的urllib系列库一样,功能足够,但是使用起来非常繁琐。

python版本的requests简直就是神器,让很多人非常敬仰。

因此我就动手按照python的requests的思想封装了一个 requests。

动手之前,我想尽量兼容 python的写法。但是golang不支持函数名称小写,

也不支持 参数命名。所以我只能用参数类型的方案来支持动态参数。

安装

golang 1.11之前

go get -u github.com/asmcos/requests

golang 1.11之后,编辑一个go.mod文件

module github.com/asmcos/requests

!!! 特别说明

由于requests代码在更新,所有例子都有是当前有效。

并且部分片段有上下文。请大家阅读时参考原代码的requests_test.go

开始使用(带Auth)

package main

import (
        "github.com/asmcos/requests"
        "fmt"
)

func main (){

        req := requests.Requests()
        resp,_ := req.Get("https://api.github.com/user",requests.Auth{"asmcos","password...."})
        println(resp.Text())
        fmt.Println(resp.R.StatusCode)
        fmt.Println(resp.R.Header["Content-Type"])
}

第一个例子为什么是它? 因为python requests第一个例子是它。。。呵呵

注意::: `密码` 和用户名要用github真实用户才能测试。

创建请求的方法

例子1

极简使用

package main

import "github.com/asmcos/requests"

func main (){

        resp,_ := requests.Get("http://go.xiulian.net.cn")
        println(resp.Text())
}

其实 requests实现都是先用Requests()函数创建一个 request 和 client,

再用req.Get去请求。

requests.Get 是一个封装,对Requests()和req.Get的一个封装。

例子2

这个例子是分成2个步骤,来操作,这样的好处是可以通过req来设置各种请求参数。

后面的例子会展示各种设置。

package main

import "github.com/asmcos/requests"


func main (){

        req := requests.Requests()

        resp,_ := req.Get("http://go.xiulian.net.cn",requests.Header{"Referer":"http://www.jeapedu.com"})

        println(resp.Text())

}

设置Header

req := Requests()

req.Header.Set("accept-encoding", "gzip, deflate, br")
req.Get("http://go.xiulian.net.cn", requests.Header{"Referer": "http://www.jeapedu.com"})

!!! 设置头的2种方法

1. 通过req.Header.Set函数直接设置

2. 调用req.Get 函数时,在函数参数里填写上

Get 支持动态参数,但是参数前面要加类型标识。

函数里面根据类型判断参数的含义。

其实 函数的参数里关于Header参数是可以多次设置的。

url1 := "http://go.xiulian.net.cn"
req.Get(url1, requests.Header{"k0": "v0"},requests.Header{"k1":"v1"},requests.Header{"k2":"v2"})

h := requests.Header{
  "k3":"v3",
  "k4":"v4",
  "k5":"v5",
}
req.Get(url1,h)

这些都可以。灵活增加头。

设置参数

p := requests.Params{
  "title": "The blog",
  "name":  "file",
  "id":    "12345",
}
resp,_ := Requests().Get("http://www.cpython.org", p)

其实参数设置。参数设置也是支持多次的。

类似如下:

resp,_ := Requests().Get("http://www.cpython.org", p,p1,p2)

POST 的form表单

data := Datas{
    "comments": "ew",
    "custemail": "a@231.com",
    "custname": "1",
    "custtel": "2",
    "delivery": "12:45",
    "size": "small",
    "topping": "bacon",
  }

resp,_ := req.Post("https://www.httpbin.org/post",data)

fmt.Println(resp.Text())

!!!! 注意 Post的form是放在body里面,而get的params 是放在url里面。

Proxy

目前不支持带密码验证的代理。

req = Requests()
req.Proxy("http://192.168.1.190:8888")
resp,_ = req.Get("https://www.sina.com.cn")

设置Cookies

requests 支持自身传递cookies。本质上是把cookies存在client.jar里面。

用户设置的cookies也会随着client.jar来传递。

req = Requests()

cookie := &http.Cookie{}
cookie.Name   = "anewcookie"
cookie.Value  = "20180825"
cookie.Path   = "/"

req.SetCookie(cookie)

fmt.Println(req.Cookies)
req.Get("https://www.httpbin.org/cookies/set?freeform=1234")
req.Get("https://www.httpbin.org")
req.Get("https://www.httpbin.org/cookies/set?a=33d")

!!! 过程说明

代码中 首先使用http.Cookie生成一个用户自定义的cooie,

req.SetCookie 实际上还没有把cookie放在client.jar里面。

在Get的时候requests会把req.Cookies里面的内容复制到client.jar里面,并且清空req.cookies

再一次Get的时候,requests都会处理Cookies。

debug

当设置了Debug = 1,请求的时候会把request和response都打印出来,

包含request的cookie, 返回的cookie没有打印。

req := Requests()
req.Debug = 1

data := Datas{
    "comments": "ew",
    "custemail": "a@231.com",
    "custname": "1",
    "custtel": "2",
    "delivery": "12:45",
    "size": "small",
    "topping": "bacon",
  }

resp,_ := req.Post("https://www.httpbin.org/post",data)

fmt.Println(resp.Text())

Debug 结果如下

===========Go RequestDebug ============
POST /post HTTP/1.1
Host: www.httpbin.org
User-Agent: Go-Requests 0.5
Content-Length: 96
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip


===========Go ResponseDebug ============
HTTP/1.1 200 OK
Content-Length: 560
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Type: application/json
Date: Sun, 02 Sep 2018 09:40:32 GMT
Server: gunicorn/19.9.0
Via: 1.1 vegur


{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "comments": "ew",
    "custemail": "a@231.com",
    "custname": "1",
    "custtel": "2",
    "delivery": "12:45",
    "size": "small",
    "topping": "bacon"
  },
  "headers": {
    "Accept-Encoding": "gzip",
    "Connection": "close",
    "Content-Length": "96",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "www.httpbin.org",
    "User-Agent": "Go-Requests 0.5"
  },
  "json": null,
  "origin": "219.143.154.50",
  "url": "https://www.httpbin.org/post"
}

Authentication 验证用户名和密码。

req = Requests()
url1 := "https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?0.45874470316137206"
resp,_ = req.Get(url1,Auth{"httpwatch","foo"})
fmt.Println(resp.httpresp)

用户名和密码的参数是加密存放在Header里面,

和params是不同的。

saveFile

接着上面的例子,如果成功了。返回的数据实际是一个jpeg格式文件。

我们可以直接存文件。

resp.SaveFile("auth.jpeg")

JSON

req = Requests()
req.Header.Set("Content-Type","application/json")
resp,_ = req.Get("https://httpbin.org/json")

var json map[string]interface{}
resp.Json(&json)

for k,v := range json{
  fmt.Println(k,v)
}

支持GZIP格式

req = Requests()
req.Debug = 1
resp,_ = req.Get("https://httpbin.org/gzip")

fmt.Println(resp.Text())

支持传文件POST

req = Requests()
req.Debug = 1
path, _ := os.Getwd()
path1 := path +  "/../examples/net1.go"
path2 := path +  "/../examples/net2.go"

resp,_ = req.Post("https://www.httpbin.org/post",data,Files{"a":path1,"b":path2})

fmt.Println(resp.Text())

header,params,是不分 GET和POST的。

返回cookies

其实requests的cookies 一直存在client.jar里面,

所以需要从client.jar读取。

resp,_ = req.Get("https://www.httpbin.org")
coo := resp.Cookies()
// coo is [] *http.Cookies
println("********cookies*******")
for _, c:= range coo{
  fmt.Println(c.Name,c.Value)
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微创新

微创新

德鲁•博迪、雅各布•戈登堡 / 钟莉婷 / 中信出版社 / 2014-4-5 / 42.00

好产品不一定要颠覆,微小改进就能让用户尖叫! 引爆创新领域的全新方法论 互联网时代行之有效的5大创新策略 创业者、产品经理必读的创新行动指南 《怪诞行为学》作者 丹•艾瑞里 《影响力》作者 罗伯特•西奥迪尼 全球50位最具影响力的商业思想家之一丹尼尔•平克 周鸿祎、黎万强、罗振宇、牛文文、张鹏 联袂重磅推荐 为什么iPod可以在众多mp3产品中......一起来看看 《微创新》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具