android - 避免 '@' 字符在 POST @FormUrlEncoded 请求期间获取 url 编码

标签 android retrofit2 okhttp

我已经绞尽脑汁大约两天了,但在使用 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/

相关文章:

java - Android Fresco SimpleDraweeView.setImageURI 不适用于此 http url

json - MockServer 和 OkHttp : body type missmatch (json vs string)

android - Android 中的旋转轮控制

java - 如何将参数/参数传递给回调函数?

android - 想要在 Android 的 ffmpeg 命令中使用 colorchanelmixer 添加色调角度

java - Retrofit2上传失败

android - 当 Retrofit2 出现任何类型的错误时向用户显示警报?

android - 启动 Qt/QML android 应用程序时如何立即显示启动画面?

java - 改造和 RxJava : How to combine two requests and get access to both results?

android - 尝试使用 httpCache android?