HttpWebRequest 跳转后(301,302)ResponseUri乱码问题
问题:
使用HttpWebRequest请求之后,ResponseUri为:
http://chongqing.anjuke.com/sale/rd1/?kw=�״�ʮ����&pi=baidu-cpc-cq-shantou1-jx&utm_term=重庆首创十方界
正确跳转地址(使用浏览器请求):
http://chongqing.anjuke.com/sale/rd1/?kw=�״�ʮ����&pi=baidu-cpc-cq-shantou1-jx&utm_term=重庆首创十方界
对比2个地址,可以发现一个奇怪的问题:地址中含有2个urlencode转换后的中文参数,奇怪的是第一个kw参数不同,而第二个utm_term参数确实相同的!这尼玛太神奇吧。。。
那么真相是什么?(找坑)
通过Fidder的Composer工具,模拟请求看看:
通过上图可以看到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,对网址参数进行正确的编码。(感觉好难!)
未完待续...
HttpWebRequest 跳转后(301,302)ResponseUri乱码问题的更多相关文章
- nginx 301 302跳转配置总结
首先看简单的代码示例,关于nginx 301 302跳转的. 301跳转设置: server { listen 80; server_name 123.com; rewrite ^/(.*) http ...
- PHP 取302跳转后真实 URL 的两种方法
1 . 第一种,CURL形式[感觉处理略慢,代码偏多] $url = '将跳转的URL'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url) ...
- 详解重定向(HTTP状态码301/302/303/307/408)附例子
本文为原创文章,转载请注明出处. 今天打算好好把状态码301.302.303.307.308好好撸一遍,并会测试下一些例子. 状态码的解释 我们都知道重定向与这几种状态码有关,来看下这几种HTTP状态 ...
- 用Java和Nodejs获取http30X跳转后的url
用Java和Nodejs获取http30X跳转后的url 转 https://calfgz.github.io/blog/2018/05/http-redirect-java-node.html 30 ...
- http status 301/302 & java重定向/转发
一.301/3021.什么是301转向?什么是301重定向? 301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header) ...
- HTTP 的重定向301,302,303,307(转)
HTTP 的重定向301,302,303,307(转) (2012-12-11 11:55:04) 转载▼ 标签: 杂谈 分类: 网络 301 永久重定向,告诉客户端以后应从新地址访问.302 作为H ...
- HTTP状态码及其含义 503 500 401 200 301 302
下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义. 应当谨慎地使用那些只有HTTP 1.1支持的状态代码,因为许多浏览器还只能够支持HTTP 1.0.如果你使用了HTTP 1.1特 ...
- Python requests 301/302/303重定向(跨域/本域)cookie、Location问题
今天使用request的get方法获取一个网站的登录页信息,结果使用charles抓包的时候发现该网站登录页303(重定向的问题),网上查了很多资料,原因如下: 一.cookie 原因:利用reque ...
- 获取经过跳转后的url地址
粗略一算,不写code已经好几个月了. 昨日受兄弟所托,为他写了一个小小的程序. 程序功能: 自动获取跳转后的Url地址 如下图所示: (newUrl.txt为转换后的地址信息...) 实现过程: 每 ...
随机推荐
- 安装linux子系统, 如何用win10 里面的linux子系统来进行通信
cd /mnt/d/linux_share即可 就把linux_share这个目录挂载到linux里面了.这样windows和linux可以同时修改和访问这个文件夹里面的内容. 安装:cmd中输入ba ...
- HierSort(希尔)————Java
利用Java进行希尔排序(元素中有0会有问题),步长经过调试length/2+1最合适. import java.util.Scanner; public class HierSort { priva ...
- 48.UIButton上的字体居右对齐
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; button.titleLabel.textAlignment = NSTe ...
- 2018.10.31 NOIP模拟 一些情报(倍增)
传送门 题目并不难(想) 其实就是用倍增维护几个树上信息. 也就这么几个: 子树内最长链及其后继点. 子树内次长链及其后继点. 子树内第三场链(也就是dzyodzyodzyo口中鬼畜的次次长链) 点i ...
- JSON转JS对象,JS对象转JSON
一.从服务端发来的json字符串,怎么才能作为JavaScript对象(JSON对象)在web端调用呢? 1.如果使用jQuery,就很方便了,可以在ajax一系列函数中,把参数Datatype传js ...
- Codeforces Round #520 (Div. 2) E. Company(dfs序判断v是否在u的子树里+lca+线段树)
https://codeforces.com/contest/1062/problem/E 题意 给一颗树n,然后q个询问,询问编号l~r的点,假设可以删除一个点,使得他们的最近公共祖先深度最大.每次 ...
- Educational Codeforces Round 51 F. The Shortest Statement(lca+最短路)
https://codeforces.com/contest/1051/problem/F 题意 给一个带权联通无向图,n个点,m条边,q个询问,询问两点之间的最短路 其中 m-n<=20,1& ...
- ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
题目链接:https://nanti.jisuanke.com/t/31443 相关前置链接 https://www.cnblogs.com/dolphin0520/p/3708602.html ht ...
- typecho 文章归档调用
<style> div { display: block; } .title { position: relative; margin: 0; line-height: 32px; fon ...
- reload maven project' has encountered a proble" 问题
由于重重原因,我取消maven的下载(可能是jar包没有公服镜像).导致重新打开sts 时发生异常. 在网上寻找到资料,发现需要删除${workspace}\.metadata\.plugins\or ...