一个一直尚未处理的Golang不兼容问题

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

最近我们在把线上系统升级至Go 1.10版本时发现,在我们实现的某些接口中,出现了客户反馈调用失败提示参数缺失的情况。这种情况我们在测试过程中未能复线,后来经过了解,发现了故障原因为Go 1.10版本升级过程中更改了部分程序代码与验证逻辑导致的。

故障说明

为了方面说明,我们假设我们存在一个要求以application/x-www-urlencoded-formContent-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获取文件形式进行获取。这个可以参考如下伪代码进行修改(未处理异常情况,请自行修改):

1
2
3
4
5
 f, _, err := req.FormFile(key)
if err == nil {
b, _ := ioutil.ReadAll(f)
value = string(b)
}

截止目前为止(Go1.10.3),该兼容性问题一直尚未处理,大家可以根据自己的情况自行判断解决方案。


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

本文来自:ipfans's Blog

感谢作者:ipfans's Blog

查看原文:一个一直尚未处理的Golang不兼容问题

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

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