版本之间的 RestSharp 行为变化 - 剩余请求参数中的令牌替换

RestSharp behavior change between versions - Token replacement in rest request parameters

我们正在升级我们使用的 RestSharp 版本以获得对 .NET Core 的支持。

旧版本为105.2.3,新版本目前为106.4.0(但以下内容同样适用于GITHub上的最新RestSharp代码)

给定以下代码:

var request = new RestRequest("/webacs/api/v1/data/{reportType}.json?.full=true&collectionTime=ge({collectionTime})&.firstResult={firstResult}");
request.AddParameter("reportType", "HistoricalClientTraffics", ParameterType.UrlSegment);
request.AddParameter("collectionTime", 1497722400000, ParameterType.UrlSegment);
request.AddParameter("firstResult", 0, ParameterType.UrlSegment);

使用 RestSharp 105.2.3,在执行请求 (GET) 时,所有三个 UrlSegment 参数都会导致发生令牌替换并生成 URL,如下所示:

/webacs/api/v1/data/HistoricalClientTraffics.json?.full=true&collectionTime=ge(1497722400000)&.firstResult=0

使用 RestSharp 106.4.0(以及来自 GITHub 的最新 RestSharp 源代码)仅替换 '?' 之前的标记发生。 '?' 之外的替换不再发生并产生错误的 URL:

/webacs/api/v1/data/HistoricalClientTraffics.json?.full=true&collectionTime=ge(%7BcollectionTime%7D)&.firstResult=%7BfirstResult%7D

(7B和7D分别是'{'和'}'的ASCII码)

这是行为改变 'by design' 吗?

(通过显式执行您自己的令牌替换来解决此问题很容易)

确实是设计使然。虽然技术上 URL 也包括查询,但 RestSharp 更接近 WebAPI 语义。 UrlSegment 可以看作 FromRouteQueryParameter 的对应物 - FromQuery.

因此,当您拥有 URL http://blah.com/customers/{customerId} 并使用以下代码时:

request.AddUrlSerment("customerId", "123");
request.AddQueryParameter("foo", "bar");

它将向 http://blah.com/customers/123?foo=bar 发出请求。