web-dev-qa-db-ja.com

Retrofit 2で配列を要求パラメーターとして追加する

Int配列(たとえば[0,1,3,5])を[〜#〜] get [〜#〜]のパラメータとして追加する方法を探しています次に、生成されるURLは次のようになります。 http:// server/service?array = [0,1,3,5]

これを行う方法 ?

17

Arrays.toString(int [])メソッドを使用し、Arrays.toStringが「[0、1、3、5]」を返すため、この結果からスペースを削除することにより、最終的にソリューションを見つけました。そして私のリクエストメソッドはこのようになります

@GET("http://server/service")
Observable<Void> getSomething(@Query("array") String array);
5

クエリパラメータとして追加するだけです

@GET("http://server/service")
Observable<Void> getSomething(@Query("array") List<Integer> array);

Int []またはInteger ...を最後のパラメーターとして使用することもできます。

12
Andrej Jurkin

次のような配列構文でクエリパラメータに名前を付ける必要があります。

@GET("http://server/service")
Observable<Void> getSomething(@Query("array[]") List<Integer> array);

構文自体は、使用されているバックエンドテクノロジによって異なりますが、角かっこ「[]」を含めない場合、通常は単一の値として解釈されます。

たとえば、array=1&array=2を使用すると、バックエンドでは通常、array=1ではなくarray=2またはarray=[1,2]としてのみ解釈されます。

4
mrstif

私は同様の問題に直面し、(質問で尋ねられたように)許容できる形に到達するためにいくつかのことをしなければなりませんでした。

  1. ArrayListを文字列に変換しました

    arrayList.toString().replace(" ", "")
    
  2. RetroFitメソッドで、上記のArrayListを受け入れるクエリパラメータを次のように変更しました。

    @Query(value = "cities", encoded = true)
    

これにより、角括弧とコンマがURLエンコードされなくなります。

4
jarora

toStringを使用してもうまくいきませんでした。代わりに、TextUtils.join(",", ids)がトリックを行います。

Queryencoded = trueを付けることを忘れないでください。

3
Sir Codesalot

まあこれは私のためのトリックをしました

ステップ1:

StateServce.kt

@GET("states/v1")
fun getStatesByCoordinates(@Query("coordinates", encoded = true) coordinates: String) : Call<ApiResponse<List<State>>>

ステップ2

リポジトリから呼び出している間

val mCoordinate : List<Double> = [22.333, 22.22]
mStateService?.getStatesByCoordinates(mCoordinate.toString().replace(" ", ""))!!
0
Jay