使用Retrofit将空参数添加到签名

时间:2016-08-26 14:52:07

标签: android oauth retrofit retrofit2

我有一个Android应用程序,它与使用RQL的API(带有OAuth v1的Jersey)进行通信。这是通过使用Retrofit 2库完成的。
要限制我提取的数据, limit(limit,offset)参数将添加到URL中。这并不容易,因为Retrofit不允许我向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);

并传递此网址: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,但没有结果。

1 个答案:

答案 0 :(得分:1)

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

改造baseUrl:&#34; http://api.acme.com/v1/&#34;

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

如果您执行getUsers("users"),则会解析为&#34; http://api.acme.com/v1/users&#34;

如果您执行getUsers("users?limit(10,2)"),则会解析为&#34; http://api.acme/com/v1/users?limit(10,2)&#34;。 (您可以在此处添加网址编码。)

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

ex)limit = X&amp; offset = Y

在这种格式中,您只需使用@Query。