Golang Go语言中的代理问题
Golang Go语言中的代理问题
const proxyServer = “http-dyn.abuyun.com:9020”
// 代理隧道验证信息
const proxyUser = “H8K54D3646J2X67D”;
const proxyPass = “C6228A18B130EF63”;
type AbuyunProxy struct {
AppID string
AppSecret string
}
func (p AbuyunProxy) ProxyClient() http.Client {
proxyUrl, _ := url.Parse(“http://”+ p.AppID +":"+ p.AppSecret +"@"+ proxyServer)
return http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}}
}
func main() {
targetUrl := “https://anime-pictures.net/pictures/download_image/640247-5528x3508-kimetsu+no+yaiba-uzui+tengen-mikki-single-short+hair-highres.png”
// 初始化 proxy http client
client := AbuyunProxy{AppID: proxyUser, AppSecret: proxyPass}.ProxyClient()
request, _ := http.NewRequest("GET", targetUrl, bytes.NewBuffer([]byte(``)))
response, err := client.Do(request)
if err != nil {
panic("failed to connect: " + err.Error())
}
/*response, err := http.Get(targetUrl)
if err != nil{
fmt.Println("请求图片 url 失败",err)
}*/
fmt.Println(response)
defer response.Body.Close()
name := "./H_1.jpg"
out, err := os.Create(name)
if err != nil{
fmt.Println("创建文件失败",err)
}
defer out.Close()
pix, err := ioutil.ReadAll(response.Body)
if err != nil{
fmt.Println(err)
}
_, err = io.Copy(out, bytes.NewReader(pix))
if err != nil {
fmt.Println("下载文件失败",err)
}
}
各位大佬帮忙看一下,我用代理返回的 status 是 200,但是 ioutil.ReadAll 读取会出现 unexpected EOF 错误,后面我又用了上面注释的 http.Get 请求,ioutil.ReadAll 读取是可以保存图片的,但是 http.Get 请求和代理请求都是 status,为什么代理不能被 ioutil.ReadAll 读取呢,上面代理用的是阿布云的代理,测试账号已经是过期的
更多关于Golang Go语言中的代理问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
第一个问题,我的意思是注释的那段 http.Get 可以保存图片,用代理不行,第二个打印一下继续执行,因为我做的是爬虫,不可能中断,重新记录这条记录太麻烦了,打印错误,直接抛弃往下执行,第三个问题,我也不知道为什么要读取,我在网上找的 go 下载网络图片都有这个步骤,我 go 刚学没多久,一直断断续续的,只能照抄,第四个我的错,没讲清楚,意思是返回的 http 的 status 都是 200,也就是成功了,返回都成功了,代理的 response.Body 读取不了,注释的哪个 http.Get 返回的 response.Body 却能保存
大概率是代理服务器有问题
初学 go,err 都处理感觉特别麻烦,而且代码看着全是判断错误,这个有很大的好处么。。一些自己判断基本不会出错的代码可不可以忽略掉 err
没办法, 当初创造 golang 的几个人都是 unix 时代的遗老遗少, 按照官方的说法就是"像 try-cache 那样将异常耦合在控制结构中会导致代码混乱".
太多重复的 err 判断一直是 go 广受诟病的三大问题之一,另两个是包管理和泛型,而且自从 try 提案被否决, 关于错误处理基本不会再有改进了, 按 russ cox 的话就是再等个十年…
艹 怎写成 try-cache 了😂
谢谢大佬
在Golang(Go语言)中,代理问题通常涉及网络请求时的中间层处理,用于控制、缓存、转换或过滤进出网络的HTTP请求和响应。Go语言内置的net/http
包提供了灵活的方式来处理代理设置。
配置HTTP客户端使用代理
-
HTTP代理: 要设置HTTP代理,可以在创建HTTP客户端时配置
Transport
字段的Proxy
属性。例如:func main() { proxyURL, _ := url.Parse("http://proxy.example.com:8080") transport := &http.Transport{ Proxy: http.ProxyURL(proxyURL), } client := &http.Client{Transport: transport} resp, _ := client.Get("http://example.com") defer resp.Body.Close() // 处理响应 }
-
环境变量: Go语言也支持通过环境变量设置代理,如
HTTP_PROXY
和HTTPS_PROXY
。这些变量可以在程序启动时由操作系统设置,Go的net/http
包会自动读取这些变量。 -
SOCKS代理: 对于SOCKS代理,需要使用第三方库如
golang.org/x/net/proxy
,它提供了对SOCKS4、SOCKS5代理的支持。
注意事项
- 确保代理服务器可用并正确配置。
- 处理可能的代理错误,如认证失败或连接超时。
- 对于敏感数据,确保代理连接的安全性。
通过上述方法,你可以在Go语言中灵活地配置和使用代理,以满足不同的网络请求需求。