2016-08-26 6 views
1

RQLを使用するAPI(Jersey with OAuth v1)と通信するAndroidアプリがあります。これはRetrofit 2ライブラリを使用して行います。
フェッチしたデータを制限するには、制限(制限、オフセット)パラメータがURLに追加されます。 Retrofitでは空のパラメータをURLに追加できないため、これは簡単ではありませんでした。
たとえば、これは私のベースURL:api.acme.com/v1で、これはユーザーエンドポイント:api.acme.com/v1/usersです。しかし、返されるユーザーの数を制限する場合は、api.acme.com/users?limit(10,2)を使用します。
Retrofitで署名に空のパラメータを追加

値のない変数名パラメータを追加するオプションがなかったので、エラーを返しませんでした唯一の方法はそうのようなURLを生成することでした:

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

と、このURLを渡すためには、 :返すhttp://api.acme.com/users?limit(10,2)

エラーがOAuthの署名を生成するときに、空のパラメータはURLに追加されないためである{"error":1,"error_name":"OAUTH_SIGNATURE_EXCEPTION","error_message":"The OAuth signature is invalid"}

あります。郵便配達員はこれらの空のパラメータをシグネチャに追加するオプションがありますが、Retrofitでこのオプションが見つからないようです。何か案は ?私のURLに空のパラメータを追加するための他のオプションも、いつでも歓迎です! 私はすでにMap、Paths、Queryで試していますが、結果はありません。

+0

「空のパラメータがURLに追加されていません」とはどういう意味ですか? – Emma

+0

Webサービスを管理できますか? – nasch

+0

@Emmaこの場合の空のパラメータは "limit(10,2)"(値のないキー)です。OAuthシグネチャの生成では、空のパラメータは追加されません。郵便配達員にはこれらを追加するオプションがありますが、私はこのオプションをレトロフィットで見つけることができません – Reyske

答えて

1

私はあなたの質問を正しく理解していれば(あなたの質問の1桁に欠けていると仮定すると、/ v1 /が制限パラメータに関係なく一貫して存在すると仮定します)、これを行うことができます。しかし、これは標準的な方法ではありません。これは回避策であり、少し醜いようです。

レトロフィットbaseUrlに:​​ "http://api.acme.com/v1/"

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

あなたがgetUsers("users")を行う場合、これはあなたがgetUsers("users?limit(10,2)")を行う場合は、 "http://api.acme.com/v1/users"

、これは "http://api.acme/com/v1/users?limit(10,2)" に解決するために解決されます。 (ここにURLエンコードを追加することもできます)

APIの変更を求める可能性がある場合は、制限を標準クエリパラメータの形式に変更することをおすすめします。

EX)リミット= X &オフセット=このフォーマットでY

、あなたは、単に@queryを使用することができます。

+0

ありがとう!これはユーザーエンドポイントで機能します。あなたのメソッドで "http://api.acme.com/v1/?limit(20,0)"というこのクエリを実行しようとすると、 "URLクエリ文字列" {x} "というエラーが表示されます動的クエリパラメータの場合は@Queryを使用します。 – Reyske

+0

"v1 /"と "?"の間にパスがありませんか?あなたがヒットしようとしている完全なパスは何ですか? – Emma

関連する問題