项目

配置 RestClient

本页面描述如何创建和配置 RestClient

基本配置

RestClient 的主要构造函数接受一个 RestClientOptions 实例。大多数情况下,无需更改默认选项值。但在某些情况下,您可能希望以不同方式配置客户端,因此需要在代码中更改一些选项。构造函数还包含几个可选参数,用于配置未涵盖在客户端选项之外的其他内容。以下是构造函数签名:

public RestClient(
    RestClientOptions       options,
    ConfigureHeaders?       configureDefaultHeaders = null,
    ConfigureSerialization? configureSerialization  = null,
    bool                    useClientFactory        = false
)

构造函数参数如下:

名称 描述 是否必需
options 客户端选项
configureDefaultHeaders 配置默认头的函数。允许为 HttpClient 配置默认头。大多数时候,您更倾向于使用 client.AddDefaultHeader
configureSerialization 配置客户端序列化器的函数,使用非默认选项或使用不同的序列化器(更多信息)
useClientFactory 指示客户端使用 SimpleFactory更多信息) 获取 HttpClient 实例

以下是使用客户端选项创建客户端的示例:

var options = new RestClientOptions("https://localhost:5000/api") {
    DisableCharset = true
};
var client = new RestClient(options);

当您只需要设置基本 URL 时,可以使用简化构造函数:

var client = new RestClient("https://localhost:5000/api");

简化构造函数将创建一个客户端选项实例,并使用作为构造函数参数提供的基本 URL。

最后,您可以使用配置函数覆盖默认选项的属性。以下是支持此方法的构造函数签名:

public RestClient(
    ConfigureRestClient?    configureRestClient     = null,
    ConfigureHeaders?       configureDefaultHeaders = null,
    ConfigureSerialization? configureSerialization  = null,
    bool                    useClientFactory        = false
)

例如:

var client = new RestClient(options => {
    options.BaseUrl = new Url("https://localhost:5000/api"),
    options.DisableCharset = true
});

您也可以将基 URL 作为构造函数参数提供:

var client = new RestClient("https://localhost:5000/api", options => {
    options.DisableCharset = true
});

使用自定义 HttpClient

默认情况下,RestSharp 会使用客户端选项创建一个 HttpClient 实例,并在整个客户端生命周期内保持它。当 RestClient 实例被释放时,它也会释放 HttpClient 实例。

有时,您可能需要提供自己的 HttpClient。例如,您想要使用 HTTP 客户端工厂创建的 HttpClient。RestSharp 允许您这样做,通过使用附加构造函数。这些构造函数如下:

// 使用现有 HttpClient 和 RestClientOptions 创建客户端(可选)
public RestClient(
    HttpClient              httpClient,
    RestClientOptions?      options,
    bool                    disposeHttpClient      = false,
    ConfigureSerialization? configureSerialization = null
)

// 使用现有 HttpClient 和可选 RestClient 配置函数创建客户端
public RestClient(
    HttpClient              httpClient,
    bool                    disposeHttpClient      = false,
    ConfigureRestClient?    configureRestClient    = null,
    ConfigureSerialization? configureSerialization = null
)

disposeHttpClient 参数告诉客户端在 RestClient 实例被释放时也释放 HttpClient 实例。默认值为 false,因为当从外部提供 HttpClient 时,通常也应该在外部释放它。

使用自定义消息处理器

除非您使用外部 HttpClient,否则 RestSharp 在构造时会创建一个,使用客户端选项来配置消息处理器。通常,您会得到一个 SocketHttpHandler(现代 .NET)或 WinHttpHandler(.NET Framework)。

可能会有情况需要配置消息处理器。例如,您想要添加一个委托消息处理器。RestSharp 允许您这样做,通过使用附加构造函数。有一个构造函数允许您传递自定义 HttpMessageHandler

public RestClient(
    HttpMessageHandler      handler,
    bool                    disposeHandler         = true,
    ConfigureRestClient?    configureRestClient    = null,
    ConfigureSerialization? configureSerialization = null
)

此构造函数将使用提供的消息处理器创建新的 HttpClient 实例。由于 RestSharp 将在 RestClient 实例被释放时释放 HttpClient 实例,因此消息处理器也将被释放。如果您想改变这一点并保留处理器,请将 disposeHandler 参数设置为 false

使用自定义消息处理器时,RestSharp 将 使用客户端选项来配置它,通常这些选项用于配置由 RestSharp 创建的消息处理器。

另一种自定义消息处理器的方法是让 RestSharp 创建处理器,然后对其进行配置,或者在其上使用委托处理器。这可以通过使用 RestClientOptions.ConfigureMessageHandler 属性来完成。它可以设置为一个函数,该函数接收 RestSharp 创建的处理器,然后返回具有不同设置的相同处理器或新处理器。

例如,如果您想在测试中使用 MockHttp 和其处理器,可以这样做:

var mockHttp = new MockHttpMessageHandler();
// 配置 MockHttp 处理器进行检查
...

var options = new RestClientOptions(Url) {
    ConfigureMessageHandler = _ => mockHttp
};
using var client = new RestClient(options);

在这个例子中,我们重赋值了处理器给 MockHttp,所以 RestSharp 创建的处理器没有被使用。在其他情况下,您可能想要使用委托处理器作为中间件,因此您会将 RestSharp 创建的处理器传递给委托处理器:

var options = new RestClientOptions(Url) {
    ConfigureMessageHandler = handler => new MyDelegatingHandler(handler)
};
using var client = new RestClient(options);

客户端选项

RestSharp 允许使用客户端选项配置 RestClient,如页面开头所述。以下详细介绍了可用的选项。

选项 描述
BaseUrl 客户端基 URL。也可以作为 RestClientOptions 构造函数参数提供。
ConfigureMessageHandler 配置 HTTP 消息处理器(见上文)。
CalculateResponseStatus 计算响应状态的函数。默认情况下,如果请求返回成功状态码或 404,则认为请求已完成。
Authenticator 客户端级别的认证器。有关认证器的更多信息,请参阅 这里
Interceptors 收集拦截器。有关拦截器的更多信息,请参阅 这里
Credentials 用于 NTLM 或 Kerberos 认证的 ICredentials 实例。在浏览器中不受支持。
UseDefaultCredentials 是否使用默认的 OS 身份验证进行 NTLM 或 Kerberos 认证。在浏览器中不受支持。
DisableCharset 设置为 true 时,Content-Type 头将不包含 charset 部分。有些较旧的 Web 服务器不理解头中的 charset 部分,无法处理请求。
AutomaticDecompression 允许自定义支持的解压缩方法。默认为 All,但在 .NET Framework 中仅支持 GZip。在浏览器中不受支持。
MaxRedirects 跟随重定向的数量。在浏览器中不受支持。
ClientCertificates 用于身份验证的 X.509 客户端证书的集合。在浏览器中不受支持。
Proxy 如果客户端需要使用非默认代理,可以使用此。在浏览器、iOS 和 tvOS 中不受支持。
CachePolicy 设置 Cache-Control 头的默认值。
FollowRedirects 指示客户端跟随重定向。默认为 true
Expect100Continue 获取或设置一个值,表示 HTTP 请求的 Expect 头是否包含 Continue
UserAgent 允许覆盖默认的 User-Agent 头,其值为 RestSharp/{version}
PreAuthenticate 获取或设置一个值,表示客户端是否在请求中发送 Authorization 头。在浏览器中不受支持。
RemoteCertificateValidationCallback 自定义验证服务器证书的函数。通常,当服务器使用不受信任的默认证书时,会使用它。

| BaseHost | 与每个请求一起发送到 Host 头的值。 | | CookieContainer | 自定义 cookie 容器,所有由客户端发出的请求都将共享。通常不需要,因为 RestSharp 会处理 cookies,而无需使用客户端级别的 cookie 容器。 | | MaxTimeout | 客户端级别的超时(以毫秒为单位)。如果还设置了请求超时,则此值将不被使用。 | | Encoding | 默认请求编码。只有在不使用 UTF-8 时才覆盖它。 | | ThrowOnDeserializationError | 如果解析响应时失败,强制客户端抛出异常。请记住,并非所有解析问题都会导致序列化器抛出异常。默认为 false,因此客户端将返回一个包含解析异常详情的RestResponse。仅对Execute...函数有效。 | | FailOnDeserializationError | 当设置为 true 时,如果客户端无法解析响应,响应对象将状态设为 Failed,尽管 HTTP 调用可能成功。默认为 true。 | | ThrowOnAnyError | 当设置为 true 时,客户端将重新抛出 HttpClient 抛出的任何异常。默认为 false。仅适用于 Execute... 函数。 | | AllowMultipleDefaultParametersWithSameName | 默认情况下,不允许添加具有相同名称的参数。您可以通过设置此属性为 true 来覆盖此行为。 | | Encode | 一个用于编码 URL 的函数,默认使用基于 Uri.EscapeDataString() 的 RestSharp 自定义函数。如果您需要使用不同的方式进行编码,请设置此属性。 | | EncodeQuery | 一个用于编码 URL 查询参数的函数,默认与 Encode 属性使用相同的函数。 |

其中一些选项由 RestSharp 代码使用,但有些仅用于配置 HttpMessageHandler。这些选项包括:

  • Credentials
  • UseDefaultCredentials
  • AutomaticDecompression
  • PreAuthenticate
  • MaxRedirects
  • RemoteCertificateValidationCallback
  • ClientCertificates
  • FollowRedirects
  • Proxy

注意: 如果将这些选项设置为非默认值未产生期望的效果,请检查您的框架和平台是否支持它们。RestSharp 不会根据这些选项的值改变行为。

IRestClient 接口提供了Options属性,因此可以在运行时检查任何选项。然而,RestSharp 将传递给客户端构造函数的选项对象转换为不可变对象。因此,实例化客户端后,不能更改任何客户端选项。这是因为,在并发环境中更改客户端选项可能会导致问题,从而使客户端失去线程安全性。此外,更改用于创建消息处理器的选项需要重新创建处理器以及 HttpClient,这不应在运行时进行。

配置请求

客户端选项应用于客户端发出的所有请求。有时,您可能希望精细调整特定请求,使其使用定制配置执行。这可以通过以下 RestRequest 属性实现:

名称 描述
AlwaysMultipartFormData 当设置为 true 时,即使不需要,请求也将作为 multipart 表单发送。默认情况下,RestSharp 仅在有多个附件的情况下发送 multipart 表单。默认为false
AlwaysSingleFileAsContent 当设置为 true 时,带有文件附件的请求不会作为 multipart 表单发送,而是作为纯内容发送。默认为 false。当 AlwaysMultipartFormData 设置为 true 或请求包含 POST 参数时,无法设置为 true
MultipartFormQuoteBoundary 默认为 true,意味着形式边界字符串将被引号包围。如果服务器对此有问题,可以将其设置为 false 以移除边界字符串周围的引号。
FormBoundary 允许指定自定义的 multipart 表单边界,而不是使用默认的随机字符串。
RequestParameters 请求参数的集合。通常,您不需要使用它,因为可以使用 Add... 函数向请求添加参数。
CookieContainer 自定义请求级 cookie 容器。默认为 null。您仍然可以使用 AddCookie 添加请求 cookies,并从响应对象获取响应 cookies,而无需使用 cookie 容器。
Authenticator 覆盖客户端级别的身份验证器。
Files 文件参数的集合,只读。使用 AddFile 向请求添加文件。
Method 请求 HTTP 方法,默认为 GET。只有在使用 ExecuteExecuteAsync 时才需要,因为其他函数(如 ExecutePostAsync )将覆盖请求方法。
Timeout 覆盖客户端级别的超时。
Resource 远程端点 URL 的资源部分。例如,使用客户端级别的基础 URL https://localhost:5000/api,并将 Resource 设置为 weather,请求将发送到 https://localhost:5000/api/weather。它可以包含资源占位符,与 AddUrlSegment 结合使用。
RequestFormat 标记请求为 JSON、XML、二进制或无。很少使用,因为如果使用了如 AddJsonBodyAddXmlBody 之类的函数,客户端将根据正文类型设置请求格式。
RootElement 用于默认反序列化器确定从何处开始反序列化的元素。仅适用于 XML 响应。请求不受影响。
OnBeforeDeserialization 已废弃 在响应被反序列化之前调用的函数。允许在调用反序列化器之前更改内容。改用 拦截器
OnBeforeRequest 已废弃HttpClient 执行请求之前调用的函数。它接收一个 HttpRequestMessage 实例。改用 拦截器
OnAfterRequest 已废弃 用于在 HttpClient 执行请求后立即调用的函数。它接收一个 HttpResponseMessage 实例。请使用拦截器代替。
Attempts 当请求需要重试时,该属性值递增 1。
CompletionOption 指示客户端何时应认为请求已完成。默认值为 ResponseContentRead。如果使用异步下载功能或流式处理,则自动更改为ResponseHeadersRead
CachePolicy 覆盖客户端缓存策略。
ResponseWriter 允许自定义响应流处理。函数获取原始响应流并返回另一个流或 null 。不能与 AdvancedResponseWriter 一起使用。
AdvancedResponseWriter 允许自定义响应处理。函数接收一个 HttpResponseMessage 实例和一个 RestRequest 实例。必须返回一个 RestResponse 实例,因此实际上覆盖了 RestSharp 的默认响应创建功能。
Interceptors 允许向请求添加拦截器。将同时调用客户端级别和请求级别的拦截器。

上面是 RestRequest 的所有配置属性。有关如何添加请求参数的更多信息,请参阅 使用页面 中关于使用参数创建请求的部分。

在本文档中