一、定义接口
为什么要定义接口而不直接使用静态类,因为接口可以注入缓存对象,这样就能从缓存中读取指定的请求头
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace Test.Common
{
/// <summary>
/// HTTP请求接口
/// </summary>
public interface IHttpClientUtils: IApplicationService
{
/// <summary>
/// 发送HTTP请求,注意Get请求第4个参数才是缓存key,因此第3个参数请设置为null
/// </summary>
/// <param name="method">HttpMethod.Get、HttpMethod.Post、HttpMethod.Put、HttpMethod.Delete</param>
/// <param name="url">完整地址</param>
/// <param name="model">请求体对象</param>
/// <param name="cacheKey">鉴权请求头缓存key</param>
/// <param name="headers">请求头</param>
/// <returns></returns>
Task<T> SendAsync<T>(HttpMethod method, string url, object model = null, string cacheKey = "", Dictionary<string, string> headers = null);
/// <summary>
/// 发送HTTP表单请求
/// </summary>
/// <param name="method">HttpMethod.Post、HttpMethod.Put</param>
/// <param name="url">完整地址</param>
/// <param name="model">请求体对象</param>
/// <param name="cacheKey">鉴权请求头缓存key</param>
/// <param name="headers">请求头</param>
/// <returns></returns>
Task<T> SendFormAsync<T>(HttpMethod method, string url, object model, string cacheKey = "", Dictionary<string, string> headers = null);
}
}
二、实现接口
1、支持https
2、支持从缓存读取鉴权请求头
3、支持对象携带文件上传
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.Caching;
using Volo.Abp.Json;
namespace Test.Common
{
/// <summary>
/// HTTP请求实现
/// </summary>
public class HttpClientUtils: ApplicationService, IHttpClientUtils
{
private readonly ILogger<HttpClientUtils> _logger;
private readonly IDistributedCache<Dictionary<string, string>> _cache;
public HttpClientUtils(
ILogger<HttpClientUtils> logger,
IDistributedCache<Dictionary<string, string>> cache)
{
_cache = cache;
_logger = logger;
}
/// <summary>
/// 发送HTTP请求
/// </summary>
/// <param name="method">HttpMethod.Get、HttpMethod.Post、HttpMethod.Put、HttpMethod.Delete</param>
/// <param name="url">完整地址</param>
/// <param name="model">请求体对象</param>
/// <param name="cacheKey">鉴权请求头缓存key</param>
/// <param name="headers">请求头</param>
/// <returns></returns>
public async Task<T> SendAsync<T>(HttpMethod method, string url, object model = null, string cacheKey = "", Dictionary<string, string> headers = null)
{
_logger.LogInformation($"SendAsync {
method.Method} url = {
url}, cacheKey = {