我已经绞尽脑汁大约两天了,但在使用 Retrofit 时,我和我的同事似乎都无法禁用 @POST 请求中 client_secret 字段的 URL 编码。我们需要从 API 端点获取访问 token ,该端点需要 application/x-www-form-urlencoded
格式的以下参数:
grant_type: "client_credentials"
scope: "CustomerService.WebApi"
client_id: "somerandomid"
client_secret: "XX@XXXXXXXXXXXXX"
当 client_secret 字段中的“@”字符被 URL 编码为 %40 并且我们的客户端后端无法处理它时,就会出现此问题。使用 Postman,这种编码似乎不会发生,我们成功获得了命中。
这是我们迄今为止所做的尝试:
- 在 @Field/@FieldMap 注解内指定
encoded=true
- 删除 @FormUrlEncoded 注释并在 header 中手动指定它,同时使用 RequestBody 作为 In 参数并使用 FormBuilder 构建请求正文
- 同时使用 @FieldMap 和 @Field 注解,但都不起作用
- 将
disableHtmlEscaping()
设置为改造客户端使用的 Gson 实例
我一直在查看大量的堆栈帖子和 git 问题,但似乎没有针对 POST 请求的修复。有些人指责 OkHTTP 客户端,有些人指责 Gson,有些人指责 Retrofit 2。JakeWharton 主张 Retrofit 关于 encoded=true
标志的测试确实有效。有人知道如何解决这个问题吗?
附注如果相关帖子没有有效答案(就像我看过的大多数帖子一样),请不要将其标记为重复。
最佳答案
OkHttp(以及 Retrofit)遵循 this spec这要求 @
在编码时进行百分比转义。我预计网络浏览器也会有同样的行为:它们也会对 @
字符进行编码。
您应该指示服务器的维护人员遵守相应的解析规范。如果不能,您可能需要在出站请求正文中手动将 %40
替换为 @
,也许需要使用 OkHttp 拦截器。
关于android - 避免 '@' 字符在 POST @FormUrlEncoded 请求期间获取 url 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68282326/