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日

相关文章

  • spring security动态配置url权限的2种实现方法

    下面为您详细讲解“Spring Security动态配置URL权限的2种实现方法”的攻略。 1. 动态配置URL权限简介 Spring Security是用于认证和授权Spring应用程序的框架。在web应用程序中,Spring Security可用于为URL和方法安全添加注释。普通的静态配置会将所有请求都一视同仁地处理。但在一些应用程序中,不同等级的用户可…

    Java 2023年5月19日
    00
  • Java数组的遍历与求和知识点

    下面是“Java数组的遍历与求和知识点”的完整攻略。 什么是Java数组? Java数组是一种容器,用来存储多个相同类型的数据值。数组是一个固定长度的容器,它包含的元素数量是在创建数组时确定的,而且这个长度在数组的整个生命周期中保持不变。 Java数组的遍历 遍历数组就是依次访问数组内的所有元素。在Java中,常用的遍历数组的方法有以下几种: 1. for循…

    Java 2023年5月26日
    00
  • Spring Boot集成Kafka的示例代码

    下面我将详细讲解“Spring Boot集成Kafka的示例代码”的完整攻略: 1. 准备工作 首先,我们需要在本地安装好 Kafka,然后创建一个 Topic。 2. 添加依赖 在 Spring Boot 项目中,我们需要使用以下两个依赖: <dependency> <groupId>org.springframework.kafk…

    Java 2023年5月20日
    00
  • Java异常处理try catch的基本使用

    Java异常处理try catch的基本使用 在Java编程中,程序执行过程中可能出现各种错误,例如文件找不到,数组越界等,这些错误被称为异常。异常处理是Java编程中最基本的编程技巧之一。Java异常处理try catch提供了一种结构化的异常处理方法,可以使程序更加健壮,便于维护。 什么是Java异常处理try catch Java异常处理try cat…

    Java 2023年5月27日
    00
  • java回溯算法解数独问题

    这是一个非常典型的回溯算法问题,下面我将为大家讲解如何使用Java实现数独问题的解法。 问题描述 给定一个数独棋盘,其中已填数字的格子用数字表示,空白格用 0 表示,要求使用一个算法将数独棋盘填完整,完成数独游戏。 这个问题是一个典型的回溯算法问题,使用回溯算法可以解决。 解题思路 回溯算法的主要思路就是通过枚举的方式,不断求解所有可能的解。 针对数独问题,…

    Java 2023年5月19日
    00
  • Spring Security入门demo案例

    下面是Spring Security入门demo案例的完整攻略。 一、前置知识 在开始学习Spring Security入门demo案例之前,你需要具备以下一些基础知识: 基本的Java编程语言和Spring框架的了解; 熟悉Spring MVC框架的开发以及相关的Maven工程构建方式。 二、Spring Security简介 Spring Securit…

    Java 2023年5月20日
    00
  • 图文详解JAVA实现快速排序

    图文详解JAVA实现快速排序 前言 快速排序(Quicksort)是一种常用的排序算法,通过将原数列分为两部分来实现排序。它的时间复杂度为O(nlogn),效率比较高,被广泛应用。 准备工作 在开始之前,我们需要准备一个Java IDE,本文使用的是Eclipse。另外,需要具备Java基础语法的基础知识,如基本数据类型、数组和循环等。 算法流程 快速排序的…

    Java 2023年5月19日
    00
  • 一文详解Object类和抽象类

    一文详解Object类和抽象类 什么是Object类 在Java中,所有的类都是继承自Object类的。Object类是Java语言中的根类,它是所有类的父类,也就是Java中的类都会隐式继承自Object类。在Object类中,定义了几个常用的方法,如: public String toString(): 返回对象的字符串表示。 public boolea…

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