余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

HttpClient使用(httpclient使用教程)

xiyangw 2022-11-24 16:39 103 浏览 0 评论

起因

在项目中需要访问Http请求的时候,通常都是使用WebRequest,主要是老项目(你懂得).如果不是老项目,应该使用HttpClient,但在.Net Core 2.1之后,官方可推荐使用使用HttpClientFactory.

1. HttpClient的使用

public static async void UseHttp()
{
    //在项目中HttpClient要静态单实例
    //这里只是为了方便
    HttpClient httpClient = new HttpClient(); 
    httpClient.BaseAddress = new Uri("http://localhost:5000"); //要访问的基地址,ip加端口

    string result = await httpClient.GetStringAsync("/Home/GetHtmlData");
    Console.WriteLine(result);
}

2.在Asp.Net Core使用HttpClientFactory

在Startup文件的ConfigureServices函数,注册HttpClient中间件

//1.在容器中注册HttpClient中间件
services.AddHttpClient("baidu", client =>
{
    client.BaseAddress = new Uri("http://localhost:5000");  
    //还可以请求定制化
});
/// <summary>
/// 在控制器中的构造函数注入IHttpClientFactory
/// </summary>
/// <param name="logger">日志</param>
/// <param name="cache">缓存</param>
/// <param name="httpClientFactory">容器在实例化HomeController的时候,会先实现IHttpClientFactory的实现DefaultHttpClientFactory(AddHttpClient在容器中注册)</param>
public HomeController(ILogger<HomeController> logger,
                        IMemoryCache cache,
                        IHttpClientFactory httpClientFactory)
{
    Console.WriteLine("有参数构造 HomeController");
    this._logger = logger;
    this._httpClientFactory = httpClientFactory;
}
/// <summary>
/// 在Action中使用HttpClient请求
/// </summary>
/// <returns></returns>
public async Task<string> GetHtmlData()
{
    //通过DefaultHttpClientFactory的CreateClient获取HttpClient实例
    var client = _httpClientFactory.CreateClient("baidu");
    return await client.GetStringAsync("/");
}

在Asp.Net Core的HttpClient中间件源码

Asp.Net Core 5源码(2022.03.15,刚刚对比最新的代码,好像变化不大):


public static IServiceCollection AddHttpClient(this IServiceCollection services)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddLogging();
    services.AddOptions();

    //
    // 向容器添加DefaultHttpClientFactory实例
    //
    services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
    services.TryAddSingleton<DefaultHttpClientFactory>();
    services.TryAddSingleton<IHttpClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());
    services.TryAddSingleton<IHttpMessageHandlerFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());

    //
    // Typed Clients
    //
    services.TryAdd(ServiceDescriptor.Transient(typeof(ITypedHttpClientFactory<>), typeof(DefaultTypedHttpClientFactory<>)));
    services.TryAdd(ServiceDescriptor.Singleton(typeof(DefaultTypedHttpClientFactory<>.Cache), typeof(DefaultTypedHttpClientFactory<>.Cache)));

    //
    // Misc infrastructure
    //
    services.TryAddEnumerable(ServiceDescriptor.Singleton<IHttpMessageHandlerBuilderFilter, LoggingHttpMessageHandlerBuilderFilter>());

    // This is used to track state and report errors **DURING** service registration. This has to be an instance
    // because we access it by reaching into the service collection.
    services.TryAddSingleton(new HttpClientMappingRegistry());

    // Register default client as HttpClient
    services.TryAddTransient(s =>
    {
        return s.GetRequiredService<IHttpClientFactory>().CreateClient(string.Empty);
    });

    return services;
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    AddHttpClient(services);

    return new DefaultHttpClientBuilder(services, name);
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action<HttpClient> configureClient)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    if (configureClient == null)
    {
        throw new ArgumentNullException(nameof(configureClient));
    }

    AddHttpClient(services);

    var builder = new DefaultHttpClientBuilder(services, name);
    builder.ConfigureHttpClient(configureClient);
    return builder;
}

public static IServiceCollection AddHttpClient(this IServiceCollection services)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddLogging();
    services.AddOptions();

    //
    // Core abstractions
    //
    services.TryAddTransient<HttpMessageHandlerBuilder, DefaultHttpMessageHandlerBuilder>();
    services.TryAddSingleton<DefaultHttpClientFactory>();
    services.TryAddSingleton<IHttpClientFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());
    services.TryAddSingleton<IHttpMessageHandlerFactory>(serviceProvider => serviceProvider.GetRequiredService<DefaultHttpClientFactory>());

    //
    // Typed Clients
    //
    services.TryAdd(ServiceDescriptor.Transient(typeof(ITypedHttpClientFactory<>), typeof(DefaultTypedHttpClientFactory<>)));
    services.TryAdd(ServiceDescriptor.Singleton(typeof(DefaultTypedHttpClientFactory<>.Cache), typeof(DefaultTypedHttpClientFactory<>.Cache)));

    //
    // Misc infrastructure
    //
    services.TryAddEnumerable(ServiceDescriptor.Singleton<IHttpMessageHandlerBuilderFilter, LoggingHttpMessageHandlerBuilderFilter>());

    // This is used to track state and report errors **DURING** service registration. This has to be an instance
    // because we access it by reaching into the service collection.
    services.TryAddSingleton(new HttpClientMappingRegistry());

    // Register default client as HttpClient
    services.TryAddTransient(s =>
    {
        return s.GetRequiredService<IHttpClientFactory>().CreateClient(string.Empty);
    });

    return services;
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    AddHttpClient(services);

    return new DefaultHttpClientBuilder(services, name);
}

public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action<HttpClient> configureClient)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (name == null)
    {
        throw new ArgumentNullException(nameof(name));
    }

    if (configureClient == null)
    {
        throw new ArgumentNullException(nameof(configureClient));
    }

    AddHttpClient(services);

    var builder = new DefaultHttpClientBuilder(services, name);
    builder.ConfigureHttpClient(configureClient);
    return builder;
}

在Asp.Net Core 6加入Minimal API

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
//在Asp.Net 6中,使用Minimal api
builder.Services.AddHttpClient("test", client =>
{
    client.BaseAddress = new Uri("http://localhost:5000");
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

//在这里注入IHttpClientFactory
app.MapGet("/", async (IHttpClientFactory httpClientFactory) =>
{
    var client = httpClientFactory.CreateClient("test");
    return await client.GetStringAsync("/");
});

app.Run();

在Asp.Net Core 6中使用Minimal API简化项目

个人能力有限,如果您发现有什么不对,请私信我

如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流

相关推荐

排序算法--归并排序_归并排序例题讲解

原理如图所示(先分割再合并):归并排序代码工作原理:1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2、设定两个指针,最初位置分别为两个已经排序序列的起始位置3、比较两个指针所...

八大排序算法-归并排序_归并排序 算法

算法思想归并排序分为三个步骤:1.分解:将数列分解成n个子数列。(如果是将数列分成2个子数列则为2路归并)2.治理:对每个子数列进行排序操作3.合并:将两个排好序的子数列进行合并生成新的数列算法实现P...

高级排序之归并排序、希尔排序_希尔排序和归并排序区别

前言继上次排序算法简单排序算法之冒泡、插入和选择排序-Java实现版后,本文学习高级排序算法——归并排序、希尔排序,快速排序将在后续更新。本文实现代码调用方法,部分来自前一个文章:简单排序算法之冒泡、...

Excel办公应用:按合并单元格排序的三大方法

1.按姓名对科目排序重点:在"C2"中输入公式=IF(A2<>"",1,C1+1),然后下拉填充。2.按姓名添加连续序号(方法一)重点:选择"A2:A11"单元格区域,在编辑栏中输入公...

快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法

知乎上有一个问题是这样的:堆排序是渐进最优的比较排序算法,达到了O(nlgn)这一下界,而快排有一定的可能性会产生最坏划分,时间复杂度可能为O(n^2),那为什么快排在实际使用中通常优于堆排序?昨天刚...

归并排序思路图解 #归并排序_归并排序百度百科

排序算法1.图解。OK,让它排一下。看好了,要开始排了。能看出来像递归吗?肯定算法难,但是这个次数非常的多,不用管次数。这个是帝规,就是递归。这是并,这是并,这是两个有序数,组合成一个最后的大的有序数...

排序算法学习——归并排序_归并排序算法稳定吗

我们先看归并排序的定义归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每...

动画|经典的归并排序究竟怎么玩儿?

作者|菠了个菜责编|郭芮由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列——《图解数据结构》,主要使用动画来描述常见的数据...

Excel中,多列数据统一排名,Rank函数直接搞定

Rank实现多列联合排序排序,那太简单啦,Excel中,升序降序,一个按键就可以。但,那是针对单列情况,若需要联合多列数据进行排序呢?如下图所示,需要对1、3、5列进行统一排序,咋弄嘞?联合排序案例先...

【数据结构与算法】归并排序_数据结构中归并排序

归并排序是建立在归并操作的一种高效的排序方法,该方法采用了分治的思想,比较适用于处理较大规模的数据,但比较耗内存,今天我们聊聊归并排序排序思想一天,小一尘和慧能坐在石头上,眺望着远方师傅,我听山下的柳...

C++基础算法:归并排序_经典排序算法-----归并排序(c语言实现)

归并排序(MergeSort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(DivideandConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列。...

马士兵说之归并排序_马士兵教育的内推是真的

大家对于排序应该是挺熟悉的吧,马士兵老师特意为排序出了一波视频,当然文章是转自博客园的,马士兵老师的视频观看请点击下方的了解更多概要本章介绍排序算法中的归并排序。内容包括:1.归并排序介绍2.归并...

C++快速排序和归并排序_c++快速排序sort

快速排序每一轮挑选一个基准元素(随机选择,编程时一般选取第一个),并让比它大或小的元素移动到基准元素的两边,把数列拆解成了两个部分。而后对这两部分分别进行快速排序。时间复杂度:O(nlogn),辅助空...

经典的排序算法——归并排序_归并排序算法步骤

归并排序(MergeSort)是一种基于分治策略的高效排序算法。它将原始数组不断地分割成两个子数组,直到每个子数组只剩下一个元素为止(即基本有序),然后再通过合并已排序的子数组来最终得到完全有序的大...

归并排序_归并排序c++实现

归并排序概念:归并排序中涉及到一个概念就是分而治之,总序列化成小序列,将小序列排序好,利用排序好的小序列,再归并排序成原来要排序的序列。所以排序前先要分:functiondivide(arr){...

取消回复欢迎 发表评论: