避免在 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,这种编码似乎并没有发生,我们成功地获得了成功。
这是我们目前已经尝试过的方法:
- 在@Field/@FieldMap 注释中指定
encoded=true
- 删除 @FormUrlEncoded 注释并在 header 中手动指定它,同时使用 RequestBody 作为 In 参数并使用 FormBuilder
构建请求 body
- 同时使用@FieldMap 和@Field 注释,但 none 有效
- 设置
disableHtmlEscaping()
为改造客户端使用的Gson实例
我一直在查看大量堆栈 post 和 git 问题,但似乎没有针对 POST 请求的修复。有些人指责 OkHTTP 客户端,有些人指责 Gson,有些人指责 Retrofit 2。JakeWharton 主张 Retrofit 关于 encoded=true
标志的测试确实有效。有人body知道如何解决这个问题吗?
P.S。如果关联的 post 没有有效答案(就像我看过的大多数 post 一样),请不要将其标记为重复项。
OkHttp(以及 Retrofit)遵循 this spec 要求 @
在编码时进行百分比转义。我希望网络浏览器也有同样的行为:它们也会对 @
字符进行编码。
您应该指示服务器的维护人员遵守相应的解析规范。如果他们不能,您可能需要在出站请求正文中手动将 %40
替换为 @
,也许使用 OkHttp 拦截器。
我已经绞尽脑汁大约两天了,但我和我的同事似乎都无法为 @[=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,这种编码似乎并没有发生,我们成功地获得了成功。
这是我们目前已经尝试过的方法:
- 在@Field/@FieldMap 注释中指定
encoded=true
- 删除 @FormUrlEncoded 注释并在 header 中手动指定它,同时使用 RequestBody 作为 In 参数并使用 FormBuilder 构建请求 body
- 同时使用@FieldMap 和@Field 注释,但 none 有效
- 设置
disableHtmlEscaping()
为改造客户端使用的Gson实例
我一直在查看大量堆栈 post 和 git 问题,但似乎没有针对 POST 请求的修复。有些人指责 OkHTTP 客户端,有些人指责 Gson,有些人指责 Retrofit 2。JakeWharton 主张 Retrofit 关于 encoded=true
标志的测试确实有效。有人body知道如何解决这个问题吗?
P.S。如果关联的 post 没有有效答案(就像我看过的大多数 post 一样),请不要将其标记为重复项。
OkHttp(以及 Retrofit)遵循 this spec 要求 @
在编码时进行百分比转义。我希望网络浏览器也有同样的行为:它们也会对 @
字符进行编码。
您应该指示服务器的维护人员遵守相应的解析规范。如果他们不能,您可能需要在出站请求正文中手动将 %40
替换为 @
,也许使用 OkHttp 拦截器。