7

python requests post date日期类型后端无法接收问题

 3 years ago
source link: https://www.liurongxing.com/python-requests-post-date-struts2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

python requests post date日期类型后端无法接收问题

作者: JavasBoy 分类: Python 发布时间: 2016-03-08 15:10 ė 110,455 views 6 没有评论

说话一个GM后台开服信息需要手动在GM后台提交,这个手动做了3个月,终于忍不了重复劳动,手动输入造成漏填及填错的问题。亮出 Python 中的 requests 模块,听说用这个写爬虫不错,palapala

很快脚本可以从文件读取相关配置信息,并能登陆后台获取 session,并提交上数据。但问题出现了,其中有个开服日期(2016-03-08 14:00:00 这种 “yyyy-MM-dd HH:mm:ss”格式)没有保存到数据库中,期间使用各种工具抓包对比浏览器手动提交的post参数均没发现问题,用 Postman 插件提交相同的参数是正常的。询问过php开发、java开发、安卓开发,都觉得拼接的 post 参数没问题。那问题在哪呢?查看后台服务日志,发现有报错,但是日志不完整,只提交有错误,无法得知更多细节问题。

询问后台开发人员,得知后台框架是使用 java 中的 struts2,放 Google 一搜索 “struts2 date 问题”,好家伙果然有很多人进了这个坑。 比如这位贴吧网友 http://tieba.baidu.com/p/2782007443。通过这个网友的日志 http://zengyi.me/blog/2015/02/07/struts-string-to-date-bug/ 得知如下

问题原因在于,Struts2 会对七种时间格式进行自动转换,其中还硬编码了”yyyy-MM-dd’T’HH:mm:ss” 这么一种格式,这是美国语言中使用的日期格式。我的请求参数中,有个日期参数是 yyyy-MM-dd 格式的,而对于yyyy-MM-dd这种日期类型,在英语语言中是没法匹配的,由于Struts2匹配日期时,使用了Locale,因此,如果客户端默认的语言环境是英语,则 Struts 无法匹配需转换的日期格式,自动转换就失败了。用户的机器和我的模拟器的语言环境都是英语,于是日期参数没有转换成功,请求就失败了。

然后我做了个试验,正能正常提交数据的 Firefox 浏览器语言改成只留下 en-us\ en两个,重新提交页面,哈哈哈,日期一样没提交上去,所以 python 脚本里只要加上 headers = {"Accept-Language": "zh-CN,zh;q=0.8"}就能正常提交日期了。看来还是后台没有完善对多语言环境的支持,不过我在这个排查过程也疏忽了一些问题,比如,只关注了post参数正不正确,而没有好好对比 header 请求头里的相关信息,槽兄在帮我排查这个问题的时候提出了要对比下请求头,但唯独漏了 Accept-Language。

排查中所使用到的工具:
1、Fiddler Web Debugger
2、Postman
3、Wireshark
4、Firebug
5、Chrome Developer Tools
及 PyCharm IDE工具 Debug代码

参考文章:

http://polaris.blog.51cto.com/1146394/315403/
http://zengyi.me/blog/2015/02/07/struts-string-to-date-bug/
http://www.jiancool.com/article/80023377219/
http://docs.python-requests.org/zh_CN/latest/user/advanced.html

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

评论

显示名称 *

电子邮箱地址 *

网站网址


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK