【问题标题】:Adding empty parameters to signature with Retrofit使用 Retrofit 向签名添加空参数
【发布时间】:2017-01-03 07:02:41
【问题描述】:

我有一个 Android 应用程序与使用 RQL 的 API(带有 OAuth v1 的泽西)进行通信。这是通过使用 Retrofit 2 库来完成的。
为了限制我获取的数据,将 limit(limit, offset) 参数添加到 URL。这并不容易,因为 Retrofit 不允许我向 URL 添加空参数。
例如,这是我的基本 URL:api.acme.com/v1,这是用户端点:api.acme.com/v1/users。但是当我想限制返回用户的数量时,我想使用api.acme.com/users?limit(10,2)

因为没有选项可以添加没有值的变量名参数,所以唯一没有返回错误的方法是像这样生成 url:

@GET Call<UserList> getUsers (@Url String path);

并传递此 URL:http://api.acme.com/users?limit(10,2)

返回的错误是{"error":1,"error_name":"OAUTH_SIGNATURE_EXCEPTION","error_message":"The OAuth signature is invalid"}

这是因为在生成 OAuth 签名时没有将空参数添加到 URL 中。 Postman 可以选择将这些空参数添加到签名中,但我似乎在 Retrofit 中找不到这个选项。有任何想法吗 ?向我的 URL 添加空参数的其他选项也总是受欢迎的! 我已经尝试过使用 Map、Paths 和 Query,但没有结果。

【问题讨论】:

  • “空参数不加到URL”是什么意思?
  • 您可以控制网络服务吗?
  • @Emma 本例中的空参数为“limit(10,2)”(没有值的键) 用于OAuth签名的生成,不添加空参数。在 Postman 中有一个添加这些的选项,但我在改造中找不到这个选项

标签: android oauth retrofit retrofit2


【解决方案1】:

如果我正确理解了您的问题(假设 /v1/ 始终存在,无论限制参数如何,假设您在问题中错过了 1 个位置。),您可以这样做。不过,这是一种非标准的方式。这是一种解决方法,但看起来有点难看。

改造baseUrl:“http://api.acme.com/v1/

@GET("{user}")
Call<UserList> getUsers(@Path("user") String user);

如果您执行getUsers("users"),则解析为“http://api.acme.com/v1/users

如果您执行getUsers("users?limit(10,2)"),则解析为“http://api.acme/com/v1/users?limit(10,2)”。 (您可以在此处添加 url 编码。)

如果您可以要求更改 API,我建议将限制更改为标准查询参数格式。

ex) 限制=X&offset=Y

在这种格式中,您可以简单地使用@Query。

【讨论】:

  • 谢谢!这适用于用户端点。当我尝试使用您的方法执行此查询:“api.acme.com/v1/?limit(20,0)”时,我收到错误“URL 查询字符串“{x}”不能有替换块。对于动态查询参数,请使用 @Query。”
  • “v1/”和“?”之间没有路径?您尝试访问的完整路径是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
相关资源
最近更新 更多