如何使用 space 签署包含查询参数的 GET 请求

How to sign a GET request containing a query parameter with a space

想要使用 Twitter search API,我的所有测试都正常,除了在我的搜索查询中包含 space 的测试。

例如:使用 @RedouaneBali has:mentions 查询的搜索会生成以下请求:

Request{method=GET, url=https://api.twitter.com/1.1/tweets/search/30day/dev.json?fromDate=201912261403&toDate=202001251248&maxResults=100&query=%40RedouaneBali%20has%3Amentions, tags={}}

并以此结尾 {"error":{"message":"Could not authenticate you."}}

所以我得出结论,签名部分是 KO,因为 space(我的查询中没有任何 space,一切正常)。我试图用 %20+ 替换它,但它都不起作用。我正在使用这个 Oauth1SigningInterceptor class 来签署我的请求。

在内部调试,我看到我的查询参数首先从 @RedouaneBali has:mentions 转换为 %40RedouaneBali+has%3Amentions 然后转换为 %2540RedouaneBali%2Bhas%253Amentions 所以它可能来自这里但不太清楚大部头书。有这个双重签名是正常的吗?

知道如何将其转换为 %20 而不是 +%2B 吗?

Twitter Doc

这是一个 ESCAPER 问题, UrlEscapers.urlPathSegmentEscaper()%20 中转换 space 而 UrlEscapers.urlFormParameterEscaper()+ 中转换 space。 双重转换显然通常基于推特文档。 查看修复文件here