避免在 POST @FormUrlEncoded 请求期间对 '@' 字符进行 url 编码

Avoid '@' char getting url encoded during POST @FormUrlEncoded request

我已经绞尽脑汁大约两天了,但我和我的同事似乎都无法为 @[=46= 中的 client_secret 字段禁用 URL 编码] 使用 Retrofit 时请求。我们需要从 API 端点获取访问令牌,该端点需要以下 application/x-www-form-urlencoded 格式的参数:

grant_type: "client_credentials"
scope: "CustomerService.WebApi"
client_id: "somerandomid"
client_secret: "XX@XXXXXXXXXXXXX"

当 client_secret 字段中的 '@' 字符 URL-encoded 进入 %40 并且我们的客户端后端无法处理时,就会出现此问题。使用Postman,这种编码似乎并没有发生,我们成功地获得了成功。

这是我们目前已经尝试过的方法:

我一直在查看大量堆栈 post 和 git 问题,但似乎没有针对 POST 请求的修复。有些人指责 OkHTTP 客户端,有些人指责 Gson,有些人指责 Retrofit 2。JakeWharton 主张 Retrofit 关于 encoded=true 标志的测试确实有效。有人body知道如何解决这个问题吗?

P.S。如果关联的 post 没有有效答案(就像我看过的大多数 post 一样),请不要将其标记为重复项。

OkHttp(以及 Retrofit)遵循 this spec 要求 @ 在编码时进行百分比转义。我希望网络浏览器也有同样的行为:它们也会对 @ 字符进行编码。

您应该指示服务器的维护人员遵守相应的解析规范。如果他们不能,您可能需要在出站请求正文中手动将 %40 替换为 @,也许使用 OkHttp 拦截器。