目录

Intro

Redirection

HttpClient AutoRedirect

Practice

More

References


Intro

前段时间写了一个小工具来帮助我们简化一个每个月一次的小任务,每个月我们公司的 BI Team 会给我们上个月访问量比较高的博客文章的 url,然后我们会根据 BI 提供博客的 url 去找到对应的博客 id,然后更新到配置中,网站会读取这个配置来显示比较受欢迎的博客文章

Redirection

我们的博客文章有一个特点,如果访问的地址只有博客文章的路径,会自动跳转到带 id 的地址,比如你访问:

https://cn.iherb.com/blog/8-natural-remedies-for-heartburn-and-acid-reflux 会自动跳转到 https://cn.iherb.com/blog/8-natural-remedies-for-heartburn-and-acid-reflux/347 ,后面新增的 347 就是对应的博客文章的 id,BI team 的同事给到我们的就是示例中的 8-natural-remedies-for-heartburn-and-acid-reflux

就是服务器端做了一个重定向,通过 浏览器的 Network 我们可以看到发生了一个 302 重定向

HttpClient AutoRedirect

根据上面的重定向,我们使用代码是不是也可以做呢,这样我们就可以做到比较自动化了,来尝试一下

var articlePath = "/8-natural-remedies-for-heartburn-and-acid-reflux/";
var httpClient = new HttpClient()
{BaseAddress = new Uri("https://cn.iherb.com/blog/")
};
using var res = await httpClient.GetAsync(articlePath[0].TrimStart('/'));
Console.WriteLine(res.RequestMessage.RequestUri.ToString());
Console.WriteLine(res.StatusCode);

猜一猜上面的代码输出结果是什么?

输出结果如下:

和你预想的结果一样吗,可以看到输出的请求地址实际上并不是我们请求的地址,这是因为默认地,HttpClient 会自动跟随重定向,如果服务器重定向了一个请求,HttpClient 会读取 response header 中的 Location 来请求下一个地址,请求地址和 response 显示的是最终一次请求的信息。

你也可以选择禁用自动重定向,下面就是一个禁用重定向的示例:

using var httpClient = new HttpClient(new HttpClientHandler()
{AllowAutoRedirect = false
})
{BaseAddress = new Uri(BaseUrl)
};
using var res1 = await httpClient.GetAsync(articlePath[0].TrimStart('/'));
Console.WriteLine(res1.RequestMessage.RequestUri.ToString());
Console.WriteLine(res1.StatusCode);

我们可以通过指定 HttpClientHandler 的 AllowAutoRedirect 属性来禁用自动重定向,禁用后的输出结果如下:

可以看到这个请求的请求地址是我们实际请求的地址,没有发生重定向

那么针对哪些请求会做重定向处理呢?通过查阅源码发现对于这些响应会尝试重定向 300/301/302/307/308, 可以参考:https://github.com/dotnet/runtime/blob/74246130d505c9243396f4a8837634e8ab3065bb/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs#L87

Practice

我们已经知道 HttpClient 会自动重定向,而且我们只需要拿到重定向后的地址即可,那我们就可以禁用自动重定向,直接读取 Response Header 里的 Location 中的值,就可以拿到要重定向的 URL 了,于是就有了下面的代码来获取博客文章的 id

private async Task<int> GetArticleId(string path)
{using var response = await httpClient.GetAsync(path.TrimStart('/'));var statusCode = (int)response.StatusCode;if(statusCode != 302){return -1;}var newLocation = response.Headers.Location.ToString();int.TryParse(newLocation[(newLocation.LastIndexOf('/') + 1)..], out var articleId);return articleId;
}

通过上面的代码我们就可以相对高效的拿到博客文章的 id,再进一步整理一下构造成我们最终配置所需要的格式

var articleIds = await Task.WhenAll(articlePath.Select(path => GetArticleId(path)));
var json = new
{articlelist = articleIds.Select(x=> new{ id=x })
}.ToJson();

这样以后我们再统计只需要拷贝一下新的数据,跑一下脚本就可以了~~

More

因为我们只关注 Response Header ,所以我们也可以把上面的 GET 请求换成 HEAD 请求,这样返回的响应就只有 Header,没有 Body 更加简洁一些

从业务的角度来看,我们可以尝试让别的 Team 同事直接提供一个 API 来返回这样的数据,这样我们就不必这样搞了 ^^

References

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/HttpClientTest/NoAutoRedirectSample.cs

  • https://github.com/dotnet/runtime/blob/main/src/libraries/Common/src/System/Net/Http/HttpHandlerDefaults.cs

  • https://github.com/dotnet/runtime/blob/74246130d505c9243396f4a8837634e8ab3065bb/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs#L87

  • https://stackoverflow.com/questions/14731980/using-httpclient-how-would-i-prevent-automatic-redirects-and-get-original-statu

  • https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

  • https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.allowautoredirect?WT.mc_id=DT-MVP-5004222&view=net-5.0

  • https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.maxautomaticredirections?view=net-5.0&WT.mc_id=DT-MVP-5004222

HttpClient 禁用自动重定向相关推荐

  1. java httpclient 重定向_如何在HttpClient中自动重定向(java,apache)

    我创建了httpClient并设置了设置 HttpClient client = new HttpClient(); client.getParams().setCookiePolicy(Cookie ...

  2. java httpclient 重定向_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等. 本文讲述怎样使用Apache HTTP ...

  3. 用Apache HttpClient实现URL重定向

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow <用Apac ...

  4. HttpClient_用Apache HttpClient实现URL重定向

    很多网站都使用了URL重定向技术,把一个原始请求从一个位置路由到另一个位置.原因可能是多方面的,比如域名转发.URL缩写.隐私保护.在同一网站维持相似的域名等. 本文讲述怎样使用Apache HTTP ...

  5. httpclient如何处理302重定向

    在使用httpclient做接口测试的时候,遇到了一个重定向的接口,由于框架原因导致的必需得重定向到另外一个域名的接口完成功能.在之前未遇到这个的情况,经过修改请求方法解决了这个问题.大致思路是:如果 ...

  6. 组策略禁止自动锁定计算机,如何在Windows 10中禁用自动锁定

    原标题:如何在Windows 10中禁用自动锁定 Windows 10附带了许多功能,这样使工作更加轻松.其实有很多方法可以根据自己的喜好个性化使用.可以通过多种方式来个性化您的体验并控制计算机的行为 ...

  7. tomcat配置重定向_在Tomcat上配置SSL以及从HTTP到HTTPS的设置自动重定向的步骤

    tomcat配置重定向 Secured Socket Layer (SSL) is the cryptography protocol to provide message security over ...

  8. 迪士尼源码_如何在迪士尼+上禁用自动播放和背景视频

    迪士尼源码 Just like Netflix, Disney+ makes it easy to binge-watch a show by automatically playing the ne ...

  9. ios禁用更新_如何为iOS应用启用或禁用自动更新

    ios禁用更新 Automatic downloads in iOS allow apps, as well as other items, to be updated automatically. ...

最新文章

  1. 远程协助软件开发_这是我从事远程软件开发人员工作的主要技巧
  2. Ubuntu磁盘空间如何扩容
  3. phpcmsv9多表联合查询分页功能实现
  4. Ubuntu下安装OpenGL/Glut库
  5. 近端策略优化深度强化学习算法
  6. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)
  7. web笔记Error:That IP address
  8. angular依赖注入_Angular依赖注入简介
  9. mysql主从复制同步实验_db.mysql.主从同步实验
  10. MySQL练习题及答案(图书管理数据库)
  11. 如何编写外挂 制作外挂 外挂教程
  12. php做网站需要的技术,建网站需要什么技术
  13. 基于纠错编码的数字水印matlab,method robustness是什么意思
  14. RT-Thread 01线程调度与管理
  15. VisualVM 启动报错Error Starting VisualVM:You are running VisualVM using Java Runtime Environment(JRE)
  16. 机器学习从零到入门 集成学习
  17. 机器人是如何实现对话的?
  18. 学习ROS常用的官方网站,学习资源整理
  19. java画球_我的世界java版指令画球教程
  20. 最小的可重现示例Minimal reproducible example

热门文章

  1. 倍福--通过第三方的EDS文件配置EIP从站的信号
  2. mkdirs php失败,mkdirs() 总失败,怎么办,多半...
  3. tox、subunit和testr
  4. digester java_利用Digester把XML转换为Java对象
  5. 视频剪辑语音转文字添加字幕
  6. 告别暗黄皮肤变水嫩皮肤的8个小习惯
  7. 【英语早教】少儿英语启蒙机构哪家好,从这几方面来告诉大家
  8. 感叹北京当程序员月薪1万只能跟在大众后面吃灰
  9. 易语言tcp多线程服务端客户端_太详细了,TCP协议面试灵魂10问,建议收藏!
  10. 开源音频处理库SoundTouch的下载地址