HttpWebRequest 跳转后(301,302)ResponseUri乱码问题

问题:

目标地址:
http://www.baidu.com/baidu.php?url=a000000aa.7D_ifdr1XkSUzuBz3rd2ccvp2mFoJ3rOUsnx8OdxeOeOLxSeqeS-OiOvr8Pe7erQKM9ks43xuMWJuBCrsN4tEwdsRP5QfHPGmsSXOj_tTr14mx5I9qxU9vIrZ1L3xUY3IOH9tqvZu_seOgj4e_r14mI-XZ1lTrOGsS8Oj4SrZx8se59RojPakbzUJO7f.

使用HttpWebRequest请求之后,ResponseUri为:
http://chongqing.anjuke.com/sale/rd1/?kw=%EF%BF%BD%D7%B4%EF%BF%BD%CA%AE%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD&pi=baidu-cpc-cq-shantou1-jx&utm_term=%E9%87%8D%E5%BA%86%E9%A6%96%E5%88%9B%E5%8D%81%E6%96%B9%E7%95%8C

正确跳转地址(使用浏览器请求):
http://chongqing.anjuke.com/sale/rd1/?kw=%CA%D7%B4%B4%CA%AE%B7%BD%BD%E7&pi=baidu-cpc-cq-shantou1-jx&utm_term=%E9%87%8D%E5%BA%86%E9%A6%96%E5%88%9B%E5%8D%81%E6%96%B9%E7%95%8C

对比2个地址,可以发现一个奇怪的问题:地址中含有2个urlencode转换后的中文参数,奇怪的是第一个kw参数不同,而第二个utm_term参数确实相同的!这尼玛太神奇吧。。。

那么真相是什么?(找坑)

通过Fidder的Composer工具,模拟请求看看:
241500061404928.jpg

通过上图可以看到302响应中的跳转地址,发现了异常:kw参数竟然是乱码!utm_term显示已经urlencode过了。也就有说kw未经过urlencode。被坑1
那么为什么Fidder和HttpWebRequest跳转得到的地址和为啥是%EF...呢,答案只有一个:他们都使用了.net内部的Uri类型来初始化HttpWebRequest:

HttpWebRequest.Create(new Uri(url))

而Uri 默认对网址中的参数进行了urlencode,而且是用了错误的编码类型进行转化!!!被坑2

如何解决这个问题

计策1:
设置不自动跳转,而后自己解码。。(挫计)

//有些请求的location中带有未urlencode的中文,而默认的http头是用ascii解码的,导致乱码,所以头需要重写编码下

HttpWebRequest.AllowAutoRedirect=false;

var headerStr = Encoding.Default.GetString(hp.ResponseHeaders.ToByteArray());
var oHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var sHeaderLines = headerStr.Replace("\r", "").Split('\n');
for (int i = 0; i < sHeaderLines.Length; i++)
{
    int index = sHeaderLines[i].IndexOf(':');
    if (index > 0)
    {
        oHeaders[sHeaderLines[i].Substring(0, index)] = sHeaderLines[i].Substring(index + 1).Trim();
    }
}
var link = oHeaders["Location"];

而后在对实现一个Uri,对网址参数进行正确的编码。(感觉好难!)

未完待续...

转载于:https://www.cnblogs.com/yczz/p/4182511.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值