不带参数的HttpClient
第一步:在Startup的ConfigureServices方法中注入ICO容器
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient(); //将HttpClient注入IOC容器
}
第二步:在控制器中使用
public class HomeController : Controller
{
private IHttpClientFactory _httpClientFactory; //注入HttpClient工厂类
public HomeController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<IActionResult> Index()
{
//使用HttpClient工厂创建一个HttpClient对象
var httpClient = _httpClientFactory.CreateClient();
var result = await httpClient.GetStringAsync("https://www.ifeng.com/");
return View(result);
}
}
带参数的HttpClient
第一步
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("csdn",client=> {
client.BaseAddress = new Uri("https://www.csdn.net");//设置这个HttpClient要请求地址的Base路径
});
}
第二步:在控制器中使用
public class HomeController : Controller
{
private IHttpClientFactory _httpClientFactory;
public HomeController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<IActionResult> Index()
{
var httpClient = _httpClientFactory.CreateClient("csdn");
//因为csdn里面已经配置了base路径了,所以这里只要配置物理路径的后缀即可
var result = await httpClient.GetStringAsync("/nav/java"); //其他它请求的就是:https://www.csdn.net/nav/java
return View(result);
}
}
以下是HttpClient源码
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<IHttpClientFactory, DefaultHttpClientFactory>();
//
// Typed Clients
//
services.TryAdd(ServiceDescriptor.Singleton(typeof(ITypedHttpClientFactory<>), typeof(DefaultTypedHttpClientFactory<>)));
//
// Misc infrastructure
//
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHttpMessageHandlerBuilderFilter, LoggingHttpMessageHandlerBuilderFilter>());
return services;
}