httpclient重定向之后获取网址信息示例

理解题意:本文旨在介绍如何利用 HttpClient 在网页发生重定向后获取最终网址信息的方法。本文将会提供两个示例帮助理解这个过程。

使用 HttpClient 获取重定向后的网址信息

在 HttpClient 中,针对重定向的处理分为两种:

  1. 允许重定向,并自动地重定向到最终站点,该方式称为自动重定向。
  2. 禁止重定向,返回非重定向的响应码,并在响应消息头中提供重定向的信息,称之为手动重定向。

除此之外,还可以通过继承 HttpClientHandler 对象来自定义重定向的处理方式。

以下是两个示例,用于介绍在 HttpClient 中如何获取重定向后的网址信息。

示例一:使用自动重定向方式获取网址信息

在使用 HttpClient 发送 GET 请求时,若对于重定向的处理方式选择了自动重定向,则在调用 GetStringAsync() 方法后,HttpClient 可以自动地重定向到最终站点,从而通过 HttpResponseMessage 对象的 RequestMessage 属性获取重定向后的网址信息。以下是示例代码:

using System.Net.Http;
using System.Threading.Tasks;

public async Task<string> GetRedirectUrlAuto(string requestUrl)
{
    var handler = new HttpClientHandler {AllowAutoRedirect = true};
    var client = new HttpClient(handler);
    var response = await client.GetAsync(requestUrl);

    var requestMessage = response.RequestMessage;
    if (requestMessage != null)
    {
        return requestMessage.RequestUri.AbsoluteUri;
    }

    return string.Empty;
}

在上述代码中,我们创建了一个 HttpClient 对象,并指定了 HttpClientHandler 对象的 AllowAutoRedirect 属性为 true,以允许使用自动重定向方式。随后,我们发起 GET 请求,并在请求完成后获取 HttpResponseMessage 对象。通过查看 RequestMessage 属性,我们可以获取到最终的网址信息。

示例二:使用手动重定向方式获取网址信息

在使用 HttpClient 发送 GET 请求时,若对于重定向的处理方式选择了禁止重定向,可以获取到重定向的响应码和重定向的信息,再根据重定向的信息进行手动处理,并最终获取到重定向后的网址信息。以下是示例代码:

using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

public async Task<string> GetRedirectUrlManual(string requestUrl)
{
    var handler = new HttpClientHandler
    {
        AllowAutoRedirect = false, // 禁用自动重定向
    };
    var client = new HttpClient(handler);
    var response = await client.GetAsync(requestUrl);

    if (response.StatusCode == HttpStatusCode.Redirect || response.StatusCode == HttpStatusCode.RedirectKeepVerb || response.StatusCode == HttpStatusCode.RedirectMethod)
    {
        var redirectUrl = response.Headers.Location?.ToString();
        if (!string.IsNullOrWhiteSpace(redirectUrl))
        {
            return redirectUrl;
        }

        var content = await response.Content.ReadAsStringAsync();
        if (!string.IsNullOrWhiteSpace(content))
        {
            var parts = content.Split(';');
            if (parts.Length > 0)
            {
                var urlPart = parts.FirstOrDefault(p => p.ToLower().StartsWith("url="));
                if (!string.IsNullOrWhiteSpace(urlPart))
                {
                    redirectUrl = WebUtility.HtmlDecode(urlPart.Substring(4));
                    if (!string.IsNullOrWhiteSpace(redirectUrl))
                    {
                        return redirectUrl;
                    }
                }
            }
        }
    }

    return string.Empty;
}

在上述代码中,我们创建了一个 HttpClient 对象,并指定了 HttpClientHandler 对象的 AllowAutoRedirect 属性为 false,以禁用自动重定向方式。随后,我们发起 GET 请求,并在请求完成后获取 HttpResponseMessage 对象。根据重定向的响应码和重定向的信息,我们可以通过 response.Headers.Location 属性或者在响应体中提取到网址信息。

以上两个示例可以帮助您了解如何在发生重定向后获取到最终的网址信息。值得注意的是,该过程中需要根据不同的重定向方式选择不同的处理方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:httpclient重定向之后获取网址信息示例 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • Java中生成二维码

    代码如下: import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.…

    Java 2023年4月18日
    00
  • Java 日志打印的15个好建议

    Java 日志打印的15个好建议 在Java开发中,日志是一个非常重要的工具。它可以帮助开发人员定位和解决问题。在使用日志时,遵循以下的15个好建议将会让日志发挥最大的作用。 1. 使用不同的日志级别 在Java中,常用的日志级别从低到高分别是DEBUG、INFO、WARN、ERROR、FATAL。在使用日志时,应该根据需要选择不同的日志级别。例如,在调试时…

    Java 2023年5月26日
    00
  • SpringBoot配置文件格式详细介绍

    Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在开发过程中,经常需要使用配置文件来配置应用程序的行为。Spring Boot支持多种配置文件格式,本文将介绍Spring Boot的配置文件格式,并提供两个示例。 Spring Boot的配置文件格式 Spring Boot支持以下几种配置文件格式: .properties:…

    Java 2023年5月15日
    00
  • Jsp和PHP共用80端口整合Apache和Tomcat(访问时无需加端口号)

    整合Apache和Tomcat服务,将Jsp和PHP共用80端口的过程如下: 步骤一:安装Apache和Tomcat 如果还没有安装Apache和Tomcat服务,请先下载安装。本示例中使用的是最新版的Apache和Tomcat,下载地址如下: Apache HTTP Server: https://httpd.apache.org/download.cgi…

    Java 2023年5月19日
    00
  • Springboot 2.6集成redis maven报错的坑记录

    首先我们来讲一下 Spring Boot 2.6 集成 Redis 的步骤。 步骤一:添加 Redis 依赖 在 Maven 项目中,我们需要在 pom.xml 文件中添加 Redis 相关依赖。 <dependency> <groupId>org.springframework.boot</groupId> <ar…

    Java 2023年5月19日
    00
  • java随机数生成具体实现代码

    当我们需要在程序中产生随机数时,Java API提供了几种不同的方法:Math类中的静态方法和java.util.Random类。 Math类生成随机数的实现代码 Math类中提供了一个random()方法来产生任意范围的随机数。通过random()方法返回一个0.0到1.0之间的随机数,对于大于1.0的范围,可以通过数学运算来实现。下面是一个产生1-100…

    Java 2023年5月23日
    00
  • SpringBoot 注解事务声明式事务的方式

    下面是详细讲解SpringBoot注解事务声明式事务的方式的完整攻略。 什么是事务 在数据库的操作中,当多条SQL语句同时执行时,为了保证数据的一致性和完整性,我们需要让这些SQL语句在一个整体中完成,有且只有所有语句都执行成功时才提交到数据库里,而任一条语句执行失败时则所有语句都不会被提交。这个整体操作就是“事务”。 在Java中,事务可以通过编程式、声明…

    Java 2023年5月15日
    00
  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    下面是详细的攻略: 1. 引入依赖 首先在pom.xml文件中添加JdbcTemplate的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifact…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部