项目

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,你可以在它们内部使用 asyncawait

使用拦截器

你可以根据需要添加任意数量的拦截器,既可添加到客户端,也可添加到请求上。拦截器按照添加的顺序执行。

通过以下方式将拦截器添加到客户端:

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)
    }]
};
在本文档中