从RestSharp迁移至HttpClient的技术咨询
从RestSharp迁移至HttpClient的解决方案
问题背景
我们当前使用RestSharp的RestClient发起请求,代码示例如下:
var client = new RestClient("<some url>"); var request = new RestRequest("", "GET"); request.AddHeader("content-type", RestClientModel.ContentType); request.AddParameter("redirect_uri", RedirectUrl); RestResponse response = await client.ExecuteAsync(request); return response;
因RestClient存在性能问题,计划迁移至HttpClient,需解决两个问题:
- 在
Startup.cs中配置将HttpClient实例注入到对应类的构造函数中; - 找到
HttpClient中与RestSharp的AddParameter等价的方法(非请求头)。
解决方案
1. Startup.cs中配置HttpClient依赖注入
在Startup.cs的ConfigureServices方法中注册HttpClient,后续可通过构造函数注入到目标业务类:
public void ConfigureServices(IServiceCollection services) { // 注册命名HttpClient(区分多客户端场景) services.AddHttpClient("MyApiClient", client => { // 设置接口基础地址,对应原RestClient的初始化URL client.BaseAddress = new Uri("<some url>"); // 预设默认请求头,对应原代码中的content-type配置 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(RestClientModel.ContentType)); }); // 注册需要注入HttpClient的业务类 services.AddScoped<MyBusinessService>(); }
在业务类中通过IHttpClientFactory获取命名HttpClient:
public class MyBusinessService { private readonly HttpClient _httpClient; public MyBusinessService(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient("MyApiClient"); } // 后续使用_httpClient发起请求 }
如果不需要区分多客户端,也可以直接注册通用HttpClient,业务类构造函数直接注入HttpClient实例即可。
2. HttpClient中替代RestSharp AddParameter的方法
RestSharp的AddParameter在GET请求中默认将参数添加到URL查询字符串,对应HttpClient的实现方式如下:
方式一:手动构建查询字符串
var queryParams = new Dictionary<string, string> { { "redirect_uri", RedirectUrl } }; // 编码查询参数 var queryString = new FormUrlEncodedContent(queryParams).ReadAsStringAsync().Result; // 拼接完整请求地址 var requestUri = new Uri($"{_httpClient.BaseAddress}?{queryString}"); var response = await _httpClient.GetAsync(requestUri);
方式二:使用UriBuilder构建URL
var uriBuilder = new UriBuilder(_httpClient.BaseAddress); var query = HttpUtility.ParseQueryString(uriBuilder.Query); // 添加参数 query["redirect_uri"] = RedirectUrl; uriBuilder.Query = query.ToString(); var response = await _httpClient.GetAsync(uriBuilder.Uri);
方式三:封装扩展方法简化调用
可以自己封装扩展方法,模拟RestSharpAddParameter的使用体验:
public static class HttpClientExtensions { public static async Task<HttpResponseMessage> GetWithParametersAsync(this HttpClient client, string path, Dictionary<string, string> parameters) { var queryString = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result; var requestUri = string.IsNullOrEmpty(path) ? $"?{queryString}" : $"{path}?{queryString}"; return await client.GetAsync(requestUri); } } // 使用示例 var parameters = new Dictionary<string, string> { { "redirect_uri", RedirectUrl } }; var response = await _httpClient.GetWithParametersAsync("", parameters);
注:如果是POST请求的表单参数,RestSharp的
AddParameter默认会添加到请求表单中,对应HttpClient只需将FormUrlEncodedContent作为请求内容传入PostAsync方法即可。
内容的提问来源于stack exchange,提问作者XamDev
相关产品推荐
相关产品推荐

