七叶笔记 » golang编程 » Go语言request.ParseForm()的注意事项

Go语言request.ParseForm()的注意事项

今天在项目中遇到一个奇怪的问题,使用Golang http.client向Golang gin封装的 Server 发送Post请求的时候的是否发现了一个问题。

关于HTTP POST请求的共通方法如下:

http_client post_form共通方法

在Server端开发完成后使用postman+android client+axios去调用server端一切正常。于是信誓旦旦的说可以发布服务器端,俗话说“帅不过三秒”……发布后切换了Go写的中转端请求地址配置时程序可以正常运行,但是这个程序并不能按照正常进度进行下去。

当时就感觉脸火辣辣的(俗话还是有道理的)!!!

于是开始了调试之路。。。。。。

1.确认Go HTTP Client共通方法是否有问题

经过调试并没有问题,参数每次都会正常走流程如a=a;b;c;d&b=2

2.进行服务端参数接口验证

发现服务器端接受到的参数永远是a=a b=2,经过断点调试最后发现问题出现golang net/http /url的ParseQuery方法中的问题。

当我们打开url.go知道paraseQuery文件可以看到这句判断 i := strings.IndexAny(key, “&;”); i >= 0 ,那么此时心中开始万马奔腾了(大家懂得)。于是开始去找go1.10的源码发现此判断还是这样。便觉得这可能是什么新的协议便在go的issue中找到了答案具体大家自己进去查看

3.综上调查发现问题解决方案如下:

a.使用http.PostForm(url,url.Value)请求远程post方法

b.在自行封装的http client方法中对v参数实现url encoding

c.在确定不会使用到;做为分隔符可以修改server端解析post参数的方法,自行去除;分隔的验证(目前我采用的方式)因为我如果使用上面的方法会影响用户的使用情况。

相关文章