You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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,需解决两个问题:

  1. 在Startup.cs中配置将HttpClient实例注入到对应类的构造函数中;
  2. 找到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:25:24