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

理解题意:本文旨在介绍如何利用 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重定向之后获取网址信息示例

基础教程推荐