在C#项目里对接第三方REST服务,如果每次都用HttpClient手写请求,很容易陷入拼接参数、处理状态码和解析JSON的重复劳动。RestSharp是一个轻量但功能完整的HTTP客户端库,它把请求构造、发送和响应反序列化都封装得很直观,特别适合快速接入各类开放接口。

一、安装与基础准备
RestSharp可以通过NuGet直接安装。在Visual Studio的包管理控制台执行下面命令即可引入最新稳定版:
// 使用NuGet Package Manager Console安装 // Install-Package RestSharp using RestSharp;
安装完成后,核心对象就是RestClient和RestRequest。前者负责管理基地址、默认头和超时等全局配置,后者描述一次具体的请求动作,比如路径、方法和参数。这种分离让多个接口调用可以共用同一个客户端实例,减少资源开销。
需要注意,RestSharp从新版开始默认使用System.Text.Json做序列化,不再强制依赖Newtonsoft.Json。如果你的项目仍使用旧版Json.NET,可以在创建客户端时指定序列化器,避免类型转换异常。
二、发送GET请求并解析数据
假设我们要调用一个返回用户信息的接口,地址是 https://ipipp.com/api/user/1 。下面代码展示了如何构造请求并把响应直接映射成强类型对象:
using RestSharp;
using System;
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
class Program
{
static void Main()
{
var client = new RestClient("https://ipipp.com/api/");
var request = new RestRequest("user/{id}", Method.Get);
request.AddUrlSegment("id", 1);
var response = client.Execute<User>(request);
if (response.IsSuccessful)
{
User user = response.Data;
Console.WriteLine($"姓名:{user.Name},邮箱:{user.Email}");
}
else
{
Console.WriteLine("请求失败:" + response.ErrorMessage);
}
}
}
上面代码中,AddUrlSegment用于替换路由模板里的占位符,比字符串拼接更安全。调用Execute<T>方法时,RestSharp会尝试把响应体反序列化为指定的泛型类型,省去了手动解析JSON的步骤。
如果接口返回的是数组,只需要把泛型换成List<User>即可。对于非200状态码,IsSuccessful会返回false,此时可以通过StatusCode和Content排查问题,而不必额外捕获异常。
三、POST提交JSON与表单
创建资源的接口通常用POST。RestSharp添加JSON主体非常简洁,直接把对象传给AddJsonBody就行:
var client = new RestClient("https://ipipp.com/api/");
var request = new RestRequest("user", Method.Post);
request.AddJsonBody(new
{
Name = "张三",
Email = "zhangsan@ipipp.com"
});
var response = client.Execute<User>(request);
Console.WriteLine(response.IsSuccessful ? "创建成功" : "创建失败");
如果对方接口要求表单格式而不是JSON,可以改用AddParameter或AddObject。RestSharp会根据内容自动设置Content-Type,不过遇到特殊网关时,建议显式调用request.AddHeader确认头信息。
对于文件上传,库提供了AddFile方法,支持一次性附加多个文件流,底层依旧走multipart表单,比手写MultipartFormDataContent直观很多。
四、超时、鉴权与错误处理
生产环境必须考虑接口慢响应和鉴权。下面的示例同时设置了超时时间和Bearer令牌:
var options = new RestClientOptions("https://ipipp.com/api/")
{
Timeout = 5000,
ThrowOnAnyError = false
};
var client = new RestClient(options);
var request = new RestRequest("secure/data", Method.Get);
request.AddHeader("Authorization", "Bearer xxxxxxxx");
var resp = client.Execute(request);
if (!resp.IsSuccessful)
{
// 根据状态码做不同处理
if (resp.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
Console.WriteLine("令牌失效,需要重新登录");
}
}
通过RestClientOptions可以统一配置代理、用户代理字符串和重试策略。虽然RestSharp本身不带自动重试,但结合Polly等库能轻松实现指数退避。
错误排查时,除了看ErrorMessage,还应检查response.Content原始文本。有些网关会把业务错误码放在200响应的JSON里,这时要靠约定字段判断,而不是单纯依赖HTTP状态。
五、与原生HttpClient的取舍
RestSharp并非取代HttpClient,而是对其常见用法做减法。下表列出两者在典型场景下的差异:
| 对比维度 | RestSharp | HttpClient |
|---|---|---|
| 代码量 | 少,链式调用 | 多,需手动处理 |
| 反序列化 | 内置支持 | 需配合Json库 |
| 灵活性 | 中,封装较好 | 高,可精细控制 |
| 适用规模 | 中小型对接 | 大型长连接服务 |
当你只是快速联调几个外部接口,或者写内部小工具,RestSharp能显著缩短开发时间。若是构建高并发网关或需要精细管理连接池,原生HttpClient仍更合适。
总的来说,掌握RestSharp的基础用法后,大部分REST调用都能在十行内完成,把精力留给业务逻辑而非传输细节。