内容简介:最近做了个根据url分析图片信息的demo,其中遇到的几个有意思的问题,发出来分享一下1."stream error: stream ID x; INTERNAL_ERROR"这种情况需要关闭http2.0,没有找到更好的解决办法
最近做了个根据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 **”
这种一般是图片不全,比如这种,不知道谁上传的腿毛图片
这种无效图片 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)
后立即执行关闭操作,有时候会报空指针
以上所述就是小编给大家介绍的《golang中http请求图片遇见的问题汇总(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大思维:集体智慧如何改变我们的世界
杰夫·摩根 / 郭莉玲、尹玮琦、徐强 / 中信出版集团股份有限公司 / 2018-8-1 / CNY 65.00
智能时代,我们如何与机器互联,利用技术来让我们变得更聪明?为什么智能技术不会自动导致智能结果呢?线上线下群体如何协作?社会、政府或管理系统如何解决复杂的问题?本书从哲学、计算机科学和生物学等领域收集见解,揭示了如何引导组织和社会充分利用人脑和数字技术进行大规模思考,从而提高整个集体的智力水平,以解决我们时代的巨大挑战。是英国社会创新之父的洞见之作,解析企业、群体、社会如何明智决策、协作进化。一起来看看 《大思维:集体智慧如何改变我们的世界》 这本书的介绍吧!