Golang Go语言中的代理问题

发布于 1周前 作者 caililin 来自 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

9 回复

几个问题
1. http.Get 会使用 DefaultClient, 根本就不走代理, 你需要用 client.Get
2. err != nil 你需要处理 而不是打印一下就继续往下执行
3. io.copy 不是直接可以把 body 的数据写入到 os file 中吗, _, err = io.Copy(out, response.Body) 绕这么大一圈创建 pix 是干什么呢
4. “但是 http.Get 请求和代理请求都是 status” 这是什么意思
5. err 都处理下, 不要用下划线忽略

unexpected EOF 一般是在读取固定长度的时候没读够才会出现的, 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

就 err 垃圾,其他的 go 完爆所有!!

没办法, 当初创造 golang 的几个人都是 unix 时代的遗老遗少, 按照官方的说法就是"像 try-cache 那样将异常耦合在控制结构中会导致代码混乱".

太多重复的 err 判断一直是 go 广受诟病的三大问题之一,另两个是包管理和泛型,而且自从 try 提案被否决, 关于错误处理基本不会再有改进了, 按 russ cox 的话就是再等个十年…

艹 怎写成 try-cache 了😂

在Golang(Go语言)中,代理问题通常涉及网络请求时的中间层处理,用于控制、缓存、转换或过滤进出网络的HTTP请求和响应。Go语言内置的net/http包提供了灵活的方式来处理代理设置。

配置HTTP客户端使用代理

  1. 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()
        // 处理响应
    }
    
  2. 环境变量: Go语言也支持通过环境变量设置代理,如HTTP_PROXYHTTPS_PROXY。这些变量可以在程序启动时由操作系统设置,Go的net/http包会自动读取这些变量。

  3. SOCKS代理: 对于SOCKS代理,需要使用第三方库如golang.org/x/net/proxy,它提供了对SOCKS4、SOCKS5代理的支持。

注意事项

  • 确保代理服务器可用并正确配置。
  • 处理可能的代理错误,如认证失败或连接超时。
  • 对于敏感数据,确保代理连接的安全性。

通过上述方法,你可以在Go语言中灵活地配置和使用代理,以满足不同的网络请求需求。

回到顶部