您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

HttpClient使用

时间:2022-03-17 13:04:15  来源:  作者:秋风技术

起因

在项目中需要访问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();
HttpClient使用

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



Tags:HttpClient   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
再也不用写请求HttpHelper了,快来试试HttpClient
前言在C#7.1之后,net推出HttpClient类代替WebRequest, HttpWebRequest, ServicePoint, and WebClient ,先来看下他们在以前的作用 &bull; HttpWebRequest和HttpWebResponse...【详细内容】
2023-08-23  Search: HttpClient  点击:(235)  评论:(0)  加入收藏
.NET Core 使用 HttpClient 的正确方式
前言HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类,用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法,如 GET、POST、PUT 和 D...【详细内容】
2023-07-02  Search: HttpClient  点击:(284)  评论:(0)  加入收藏
SpringCloud gateway自定义请求的 httpClient
SpringCloud gateway 在实现服务路由并请求的具体过程是在 org.springframework.cloud.gateway.filter.NettyRoutingFilter 的过滤器中,该过滤器封装了具体的请求参数,以及根...【详细内容】
2022-07-30  Search: HttpClient  点击:(547)  评论:(0)  加入收藏
HttpClient使用
起因在项目中需要访问Http请求的时候,通常都是使用WebRequest,主要是老项目(你懂得).如果不是老项目,应该使用HttpClient,但在.Net Core 2.1之后,官方可推荐使用使用HttpCli...【详细内容】
2022-03-17  Search: HttpClient  点击:(396)  评论:(0)  加入收藏
HttpClient高级进阶-SSL
简介本文将展示如何使用“全部接受”SSL支持配置Apache HttpClient 4。目标很简单 - 使用没有有效证书的HTTPS URL。SSLPeerUnverifiedException如果不使用HttpClient配置SS...【详细内容】
2021-04-01  Search: HttpClient  点击:(410)  评论:(0)  加入收藏
HttpClient三个超时时间详解
HttpClient有三种超时时间设置,在RequestConfig配置类中定义的,分别为connectionRequestTimeout、connectTimeout和socketTimeout,如下图,然后分开讲解。RequestConfig三种超时...【详细内容】
2020-09-10  Search: HttpClient  点击:(5940)  评论:(0)  加入收藏
httpClient 请求接口如何优雅的重试
httpClient 请求接口失败要重试,一般人想到的可能是 做try catch 然后循环请求,但是这种方法写起来很麻烦,而且不优雅。今天就说下另外一种重试的方法,就是引入Microsoft.Extens...【详细内容】
2020-09-07  Search: HttpClient  点击:(911)  评论:(0)  加入收藏
.NET CORE HttpClient使用
自从HttpClient诞生依赖,它的使用方式一直备受争议,framework版本时代产生过相当多经典的错误使用案例,包括Tcp链接耗尽、DNS更改无感知等问题。有兴趣的同学自行查找研究。在....【详细内容】
2020-08-19  Search: HttpClient  点击:(418)  评论:(0)  加入收藏
Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页
【前言】你是否也曾羡慕过有些 phython 大神有着如下的神操作: 他们就轻轻的执行一串代码,就能循环的抓取很多自己想要的数据。其实不用太羡慕他们,因为不光 phython 能实现,我...【详细内容】
2020-08-13  Search: HttpClient  点击:(349)  评论:(0)  加入收藏
httpclient连接池管理,你用对了?
一、前言为何要用http连接池那?因为使用它我们可以得到以下好处:因为使用它可以有效降低延迟和系统开销。如果不采用连接池,每当我们发起http请求时,都需要重新发起Tcp三次握手...【详细内容】
2020-06-13  Search: HttpClient  点击:(401)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(1)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(0)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(0)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(3)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(8)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(15)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(11)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(8)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
站内最新
站内热门
站内头条