Go语言学习笔记:Http请求--Gorequest使用

最近几天部署代理池的时候,用Python写了requests请求测试IP地址检测连通性的脚本。但是发现了一个问题,requests.get带代理请求有时候请求不通。
我初步认为代理的问题,但是之后我用了curl请求发现代理是正常的,用Go写了测试发现还是正常的。难道是requests的问题?目前不知道是什么原因,之后我用Go写了代理的测试,由此我发现了一个Go语言比较好用的Http请求的包——Gorequest。

Go语言中net/http的代理请求
net/http请求整体流程并不复杂,用nrt/http包的get,post方法都可以实现。
但是,在配置代理上,需要单独配置Client客户端:

1.//发送请求  
2.rqt, err := http.NewRequest("GET", testApi, nil)  
3.if err != nil {  
4.    fmt.Println(err)  
5.    return  
6.}  
7.//配置代理  
8.client := &http.Client{  
9.    Transport: &http.Transport{  
10.        Proxy: http.ProxyURL(urlProxy),  
11.    },  
12.}  
13.response, err := client.Do(rqt)  
14.if err != nil {  
15.    fmt.Println(err)  
16.    panic(err)  
17.    return  
18.}  

直到我发现了Gorequest

Gorequest
$ go get github.com/parnurzeal/gorequest //安装
get请求:

1.request := gorequest.New()  
2.resp, body, errs := request.Get(url).End()  

gorequest代理,非常简单

1.request := gorequest.New().Proxy("代理")  

Gorequest获取代理并进行测试
获取代理方法
定义一个getRes函数,接收url,进行http请求并返回请求内容

1.func getRes(url string) string{  
2.    defer func() {  
3.        err := recover()  
4.        if err != nil {  
5.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
6.        }  
7.    }()  
8.    //获取代理  
9.    _, body, errs := gorequest.New().Get(url).End()  
10.    if errs != nil {  
11.        panic(errs)  
12.    }  
13.    return body  
14.}  

定义一个getIp方法,获取代理并处理返回的json(首先定义一个结构体以便处理json)

1.type reqinfo struct {  
2.    Code int //返回结果代码  
3.    Success bool //success参数是否请求成功  
4.    Msg,RequestIp string //返回信息和本地请求的IP地址  
5.    Data []map[string]interface{} //返回的IP,类型是以key为字符串,值为空接口的map组成的array   
6.}  
1.func getiP(getipUrl string){  
2.    defer func() {  
3.        err := recover()  
4.        if err != nil {  
5.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
6.        }  
7.    }()  
8.    body :=getRes(getipUrl)  
9.    fmt.Println(body)  
10.    //处理json  
11.    var info reqinfo  
12.    err := json.Unmarshal([]byte(body),&info)  
13.    if err != nil {  
14.        fmt.Println("json error",err)  
15.    }  
16.}  

for循环并用goroutine多线程检测IP

1.for _,v := range info.Data{  
2.    IP := v["ip"]  
3.    port := v["port"]  
4.    proxyUrl := fmt.Sprint("http://",IP,":",port)  
5.    fmt.Println(proxyUrl)  
6.    url := "https://api.myip.la/en?json"  
7.    wg.Add(1)  
8.    go ipcheck(url,proxyUrl)  
9.}  
10.wg.Wait() 
1.func ipcheck(url string,proxy string){  
2.    request := gorequest.New().Proxy(proxy)  
3.    _, body, errs := request.Get(url).  
4.        Set("User-Agent", `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36`).  
5.        End()  
6.    if errs != nil {  
7.        fmt.Println(errs)  
8.    }  
9.    fmt.Println(body)  
10.    defer wg.Done()  
11.    defer func() {  
12.        err := recover()  
13.        if err != nil {  
14.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
15.        }  
16.    }()  
17.}  

测试结果
Go语言学习笔记:Http请求--Gorequest使用_第1张图片
本次代理测试使用的是ipidea的代理,地区覆盖广,亲测测试通过率不低,新用户可以白嫖流量哦。
地址:http://www.ipidea.net/

完整代码

1.package main  
2.   
3.import (  
4.    "encoding/json"  
5.    "fmt"  
6.    "github.com/parnurzeal/gorequest"  
7.    "sync"  
8.    "time"  
9.)  
10.   
11.var wg sync.WaitGroup  
12.   
13.type reqinfo struct {  
14.    Code int  
15.    Success bool  
16.    Msg,RequestIp string  
17.    Data []map[string]interface{}  
18.}  
19.   
20.//api  
21.func getRes(url string) string{  
22.    defer func() {  
23.        err := recover()  
24.        if err != nil {  
25.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
26.        }  
27.    }()  
28.    //获取代理  
29.    _, body, errs := gorequest.New().Get(url).End()  
30.    if errs != nil {  
31.        panic(errs)  
32.    }  
33.    return body  
34.}  
35.   
36.func ipcheck(url string,proxy string){  
37.    request := gorequest.New().Proxy(proxy)  
38.    _, body, errs := request.Get(url).  
39.        Set("User-Agent", `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36`).  
40.        End()  
41.    if errs != nil {  
42.        fmt.Println(errs)  
43.        //panic(errs)  
44.    }  
45.    fmt.Println(body)  
46.    defer wg.Done()  
47.    defer func() {  
48.        err := recover()  
49.        if err != nil {  
50.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
51.        }  
52.    }()  
53.}  
54.   
55.func getiP(getipUrl string){  
56.    defer func() {  
57.        err := recover()  
58.        if err != nil {  
59.            fmt.Println(time.Now().Format("2006-01-02 15:04:05 07"), "【http error】", "返回信息:", err)  
60.        }  
61.    }()  
62.    body :=getRes(getipUrl)  
63.    fmt.Println(body)  
64.    //处理json  
65.    var info reqinfo  
66.    err := json.Unmarshal([]byte(body),&info)  
67.    if err != nil {  
68.        fmt.Println("json error",err)  
69.    }  
70.    for _,v := range info.Data{  
71.        IP := v["ip"]  
72.        port := v["port"]  
73.        proxyUrl := fmt.Sprint("http://",IP,":",port)  
74.        fmt.Println(proxyUrl)  
75.        url := "https://api.myip.la/en?json"  
76.        wg.Add(1)  
77.        go ipcheck(url,proxyUrl)  
78.    }  
79.    wg.Wait()  
80.}  
81.   
82.func main() {  
83.    getipUrl := "代理链接"  
84.    getiP(getipUrl)  
85.}  

你可能感兴趣的:(go前端css后端)