配置 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 。只有在使用 Execute 或 ExecuteAsync 时才需要,因为其他函数(如 ExecutePostAsync )将覆盖请求方法。 |
Timeout |
覆盖客户端级别的超时。 |
Resource |
远程端点 URL 的资源部分。例如,使用客户端级别的基础 URL https://localhost:5000/api ,并将 Resource 设置为 weather ,请求将发送到 https://localhost:5000/api/weather 。它可以包含资源占位符,与 AddUrlSegment 结合使用。 |
RequestFormat |
标记请求为 JSON、XML、二进制或无。很少使用,因为如果使用了如 AddJsonBody 或 AddXmlBody 之类的函数,客户端将根据正文类型设置请求格式。 |
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
的所有配置属性。有关如何添加请求参数的更多信息,请参阅 使用页面 中关于使用参数创建请求的部分。