RestSharp 拦截器
请求和响应拦截
RestSharp 的一个强大特性是拦截器,它允许你在发送或接收请求和响应之前对其进行修改。你可以使用拦截器添加头、修改请求体,甚至取消请求。你还可以在返回调用者之前修改响应。
实现拦截器
要实现拦截器,你需要创建一个继承自 Interceptor
基类的类。基类将所有拦截器方法声明为虚拟的,这样你可以在派生类中重写它们。
你可以重写的方法包括:
BeforeRequest(RestRequest request, CancellationToken cancellationToken)
AfterRequest(RestResponse response, CancellationToken cancellationToken)
BeforeHttpRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken)
AfterHttpResponse(HttpResponseMessage responseMessage, CancellationToken cancellationToken)
BeforeDeserialization(RestResponse response, CancellationToken cancellationToken)
所有这些函数都必须返回一个 ValueTask
实例。
以下是一个在请求中添加头的拦截器示例:
// 这个拦截器向请求添加一个头
// 在实际应用中,你通常不会使用这个拦截器,因为 RestSharp 已经提供了添加请求头的方法
class HeaderInterceptor(string headerName, string headerValue) : Interceptors.Interceptor {
public override ValueTask BeforeHttpRequest(HttpRequestMessage requestMessage, CancellationToken cancellationToken) {
requestMessage.Headers.Add(headerName, headerValue);
return ValueTask.CompletedTask;
}
}
由于拦截器函数返回 ValueTask
,你可以在它们内部使用 async
和 await
。
使用拦截器
你可以根据需要添加任意数量的拦截器,既可添加到客户端,也可添加到请求上。拦截器按照添加的顺序执行。
通过以下方式将拦截器添加到客户端:
var options = new RestClientOptions("https://api.example.com") {
Interceptors = [new HeaderInterceptor("Authorization", token)]
};
var client = new RestClient(options);
当你向客户端添加拦截器时,它将应用于该客户端发出的所有请求。
你也可以将拦截器添加到特定请求:
var request = new RestRequest("resource") {
Interceptors = [new HeaderInterceptor("Authorization", token)]
};
在这种情况下,该拦截器仅会应用于指定的请求。
警告:已弃用
拦截器旨在取代 RestSharp 版本 111.0 之前的现有请求钩子。这些钩子被标记为 Obsolete
,将在未来版本中移除。如果你正在使用这些钩子,我们建议尽快迁移到拦截器。
为了简化迁移过程,RestSharp 提供了一个名为 CompatibilityInterceptor
的类。它具有 RestSharp 110.0 及更早版本可用的钩子属性。你可以使用它来迁移代码到拦截器,而无需更改现有逻辑。
例如,使用 OnBeforeRequest
钩子的代码:
var request = new RestRequest("success");
request.OnBeforeDeserialization += _ => throw new Exception(exceptionMessage);
可以像这样迁移到拦截器:
var request = new RestRequest("success") {
Interceptors = [new CompatibilityInterceptor {
OnBeforeDeserialization = _ => throw new Exception(exceptionMessage)
}]
};