go 代理问题

2020-04-01 10:30:32 +08:00
 347443579
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 读取呢,上面代理用的是阿布云的代理,测试账号已经是过期的

1983 次点击
所在节点    Go 编程语言
8 条回复
Fitz
2020-04-01 11:47:15 +08:00
几个问题
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 应该不会出现吧, 你这个图片太大了, 我用本地的代理试了下其他图片没什么问题
347443579
2020-04-01 17:55:55 +08:00
@Fitz 第一个问题,我的意思是注释的那段 http.Get 可以保存图片,用代理不行,第二个打印一下继续执行,因为我做的是爬虫,不可能中断,重新记录这条记录太麻烦了,打印错误,直接抛弃往下执行,第三个问题,我也不知道为什么要读取,我在网上找的 go 下载网络图片都有这个步骤,我 go 刚学没多久,一直断断续续的,只能照抄,第四个我的错,没讲清楚,意思是返回的 http 的 status 都是 200,也就是成功了,返回都成功了,代理的 response.Body 读取不了,注释的哪个 http.Get 返回的 response.Body 却能保存
Fitz
2020-04-01 19:44:01 +08:00
大概率是代理服务器有问题
ljy1398202806
2020-04-02 14:58:03 +08:00
@Fitz 初学 go,err 都处理感觉特别麻烦,而且代码看着全是判断错误,这个有很大的好处么。。一些自己判断基本不会出错的代码可不可以忽略掉 err
347443579
2020-04-02 15:11:40 +08:00
@ljy1398202806 就 err 垃圾,其他的 go 完爆所有!!
Fitz
2020-04-02 15:39:24 +08:00
@ljy1398202806 没办法, 当初创造 golang 的几个人都是 unix 时代的遗老遗少, 按照官方的说法就是"像 try-cache 那样将异常耦合在控制结构中会导致代码混乱".

太多重复的 err 判断一直是 go 广受诟病的三大问题之一,另两个是包管理和泛型,而且自从 try 提案被否决, 关于错误处理基本不会再有改进了, 按 russ cox 的话就是再等个十年.....
Fitz
2020-04-02 15:42:25 +08:00
艹 怎写成 try-cache 了😂
ljy1398202806
2020-04-02 16:15:30 +08:00
@Fitz 谢谢大佬

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

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

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

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

© 2021 V2EX