golang中http请求图片遇见的问题汇总(一)

yinshidaoshi · · 6629 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近做了个根据url分析图片信息的demo,其中遇到的几个有意思的问题,发出来分享一下 一.“**http请求返回错误**” 1."stream error: stream ID x; INTERNAL_ERROR" 这种情况需要关闭http2.0,没有找到更好的解决办法 2.“**request canceled**” timeout这点之前笔者没有在意过,设置超时时间都是简单粗暴的: ```` client := &http.Client{ Timeout:5 * time.Second, } ```` 这样虽然简便,这个相当于一个deadline,不管连接上没连接上,不管成功没成功,5秒后都会被判为超时。 这样就有一个问题,如果我请求一张非常大的图片,即使已经请求成功连接上了,也会因为我们设置的超时时间过短不得已中断请求报出**“request canceled”**,那我们想只要有数据流通就不会中断连接应该怎么做呢 ``` transport := &http.Transport{IdleConnTimeout: DefaultConnectTimeout} client := &http.Client{ Transport: transport, } ``` 这样即使下载速度很慢也不会再下载过程中断开请求。 二.“**ioutil.ReadAll 错误**” 1.“**invalid JPEG format: short Huffman data **” 这种一般是图片不全,比如这种,不知道谁上传的腿毛图片 ![MzgyNjMwOF9EU0NfMDAwMS5qcGdfMV8yMDE3MDYyNzE2NDE1NTAwMg.jpg](https://static.studygolang.com/181207/dc7c188b59b371e7e163c71666ed0701.jpg) 这种无效图片go的image包解析会报“ short Huffman data”,暂时没有找到好的解决方案 2.“**EOF**” 这种情况下一般是网络波动错误,轻易不会报的,如果特别频繁的话,可能需要检查一下是不是对url做了某些处理,像笔者就是使用了第三方软件导致频繁报EOF 三.**关于泄露的问题** 自己部署好服务跑了跑,过了几天突然开始报一个奇怪的错误 `dial tcp ip:80: connect: cannot assign requested address`,搜了很长时间不知道是什么错误,问了一下大佬,说是看起来像泄露这方面的错误,于是检查自己的代码,看看是不是有的地方没有关闭。 果不其然,仔细查看后发现如下问题 ``` resp, err := config.NoProxyHttpClient.Do(req) if err != nil { glog.V(4).Infof("url: %s,http err: %s\n", imgUrl, err) return nil, err } if resp.StatusCode != 200 { glog.V(4).Infof("url: %s,resp.StatusCode: %d\n", imgUrl, resp.StatusCode) err = errors.New(config.HTTPERRORCODE) return nil, err } defer resp.Body.Close() ``` `resp.Body.Close()`关闭方式不对,应该在判断err后立即执行defer语句 ``` resp, err := config.NoProxyHttpClient.Do(req) if err != nil { glog.V(4).Infof("url: %s,http err: %s\n", imgUrl, err) return nil, err } defer resp.Body.Close() if resp.StatusCode != 200 { glog.V(4).Infof("url: %s,resp.StatusCode: %d\n", imgUrl, resp.StatusCode) err = errors.New(config.HTTPERRORCODE) return nil, err } ``` ps:我尝试过在`resp, err := config.NoProxyHttpClient.Do(req)`后立即执行关闭操作,有时候会报空指针

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6629 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传