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

栏目: Go · 发布时间: 7年前

内容简介:最近我们在把线上系统升级至Go 1.10版本时发现,在我们实现的某些接口中,出现了客户反馈调用失败提示参数缺失的情况。这种情况我们在测试过程中未能复线,后来经过了解,发现了故障原因为Go 1.10版本升级过程中更改了部分程序代码与验证逻辑导致的。为了方面说明,我们假设我们存在一个要求以但是在使用过程中,某些开发人员素质不足,从网上检索部分代码复制粘贴(如部分Java开发),导致提交

最近我们在把线上系统升级至 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 获取文件形式进行获取。这个可以参考如下伪代码进行修改(未处理异常情况,请自行修改):

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

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

黑客攻防技术宝典(第2版)

黑客攻防技术宝典(第2版)

[英] Dafydd Stuttard、[英] Marcus Pinto / 石华耀、傅志红 / 人民邮电出版社 / 2012-6-26 / 99.00元

内容简介: Web应用无处不在,安全隐患如影随形。承载着丰富功能与用途的Web应用程序中布满了各种漏洞,攻击者能够利用这些漏洞盗取用户资料,实施诈骗,破坏其他系统等。近年来,一些公司的网络系统频频遭受攻击,导致用户信息泄露,造成不良影响。因此,如何确保Web应用程序的安全,已成为摆在人们眼前亟待解决的问题。 本书是Web安全领域专家的经验结晶,系统阐述了如何针对Web应用程序展开攻击与......一起来看看 《黑客攻防技术宝典(第2版)》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具