真是晕啊!
这几天做个模拟机器人居然出现这样一个表单编码的问题,之前从来都没遇到过,我要登录的一个页面是需要提交viewstate,但viewstate中含有很多空格,我在请求提交数据的时候设置了表单的编码request.ContentType = "application/x-www-form-urlencoded";post过去的数据也经过了UrlEcode编码,但始终是模拟登录不了,找了两天都找不到问题是出在哪,任务进度的时间就快到了,真是急死我了,实在没办法,请求项目经理帮助,经过研究发现原来是ViewState中空格编码的问题,viewstate经过HttpUtility.UrlEncode编码后,空格编码成了+号,这样是不行的,这里还需要把+替换成%20才行,唉,终于天晴了,可以松口气了,明天加油,继续把下面的任务完成。
参考资料:
问题分析:
查了下JS encode的相关内容, 总于发现+号的秘密。
html中因为一些非标准的做法,将+等同于空格进行处理(当Html的表单被提交时, 每个表单域都会被Url编码之后才在被发送。由于历史的原因,表单使用的Url编码实现并不符合最新的标准。例如对于空格使用的编码并不是%20,而是+号,如果表单使用的是Post方法提交的,我们可以在HTTP头中看到有一个Content-Type的header,值为 application/x-www-form-urlencoded,大部分应用程序均能处理这种非标准实现的Url编码)。
在搜索引擎中做了下尝试:
keyword = e h变送器 , url =http://www.google.cn/search?hl=zh-CN&newwindow=1&q=e+h变送器 (空格被转化为+号)
keyword = e+ h变送器 , url = http://www.google.cn/search?hl=zh-CN&newwindow=1&q=e%2Bh变送器 (+号被进行了转义为%2B,程序才能正常处理)
参考地址:http://agapple.iteye.com/blog/773061