内容简介:最近我们在把线上系统升级至Go 1.10版本时发现,在我们实现的某些接口中,出现了客户反馈调用失败提示参数缺失的情况。这种情况我们在测试过程中未能复线,后来经过了解,发现了故障原因为Go 1.10版本升级过程中更改了部分程序代码与验证逻辑导致的。为了方面说明,我们假设我们存在一个要求以但是在使用过程中,某些开发人员素质不足,从网上检索部分代码复制粘贴(如部分Java开发),导致提交
最近我们在把线上系统升级至 Go 1.10版本时发现,在我们实现的某些接口中,出现了客户反馈调用失败提示参数缺失的情况。这种情况我们在测试过程中未能复线,后来经过了解,发现了故障原因为Go 1.10版本升级过程中更改了部分程序代码与验证逻辑导致的。
故障说明
为了方面说明,我们假设我们存在一个要求以 application/x-www-urlencoded-form
的 Content-Type
提交的表单,在具体的实现过程中,我们采用标准库 net/http
中的 ParseForm
方法处理表单,最后获取结果。
但是在使用过程中,某些开发人员素质不足,从网上检索部分代码复制粘贴(如部分 Java 开发),导致提交 multipart/formdata
数据到服务器进行请求。这个请求方式在 ParseForm
处理中是可以被接受的,代码会根据 Content-Type
进行处理:如果是提供了 multipart
的数据,Go内部也会正常处理。
在Go1.10在开发过程中,在
CL70931
中进行了修改,为了兼容 RFC2388
中文件名称可选的问题。在修改之后,在使用 multipart/formdata
方式提交的表单会被统一识别成文件,只能通过 http.Request.FormFile
方式读取。这样就导致我们使用 FormValue
读取表单数据后读取结果为空。
故障处理
处理方式不碍乎两种,一种是推动用户修改自己的代码,这种不需要额外修改。
另外一种主要是己方动作,兼容Go1.10+版本带来的问题(或者降级1.9版本)。这里主要介绍一下第二种方法的处理。
在第二种方法中,我们需要将使用 FormValue
读取的数据更换为 FormFile
获取文件形式进行获取。这个可以参考如下伪代码进行修改(未处理异常情况,请自行修改):
f, _, err := req.FormFile(key) if err == nil { b, _ := ioutil.ReadAll(f) value = string(b) }
截止目前为止(Go1.10.3),该兼容性问题一直尚未处理,大家可以根据自己的情况自行判断解决方案。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 尚未到来的远程工作
- 尚未到来的远程工作
- ONT 链网架构尚未成型|标准共识评级调整
- WTC测评:核心团队从业经验,核心代码尚未开源
- Linux内核发现两个尚未修复的DoS漏洞
- 谷歌安全团队发现苹果macOS漏洞,至今尚未修复
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Persuasive Technology
B.J. Fogg / Morgan Kaufmann / 2002-12 / USD 39.95
Can computers change what you think and do? Can they motivate you to stop smoking, persuade you to buy insurance, or convince you to join the Army? "Yes, they can," says Dr. B.J. Fogg, directo......一起来看看 《Persuasive Technology》 这本书的介绍吧!