web-dev-qa-db-fra.com

Ajouter un tableau comme paramètre de demande avec Retrofit 2

Je cherche un moyen d'ajouter un tableau int (par exemple [0,1,3,5]) comme paramètre dans un [~ # ~] get [~ # ~] demande avec retrofit 2. Ensuite, l'url générée doit être comme ceci: http: // server/service? array = [0,1,3,5]

Comment faire ça?

17
François Legrand

J'ai finalement trouvé une solution en utilisant la méthode Arrays.toString (int []) et en supprimant les espaces dans ce résultat car Arrays.toString retourne "[0, 1, 3, 5]". Et ma méthode de demande ressemble à ceci

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

Ajoutez-le simplement comme paramètre de requête

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

Vous pouvez également utiliser int [] ou Integer ... comme dernier paramètre;

12
Andrej Jurkin

Vous devez nommer votre paramètre de requête avec une syntaxe de tableau comme ceci:

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

La syntaxe elle-même variera en fonction de la technologie d'arrière-plan utilisée, mais ne pas inclure les crochets "[]" sera normalement interprété comme une valeur unique.

Par exemple, en utilisant array=1&array=2 sera généralement interprété par les backends comme seulement array=1 ou array=2 au lieu de array=[1,2].

4
mrstif

J'ai rencontré un problème similaire et j'ai dû faire deux ou trois choses pour atteindre le formulaire acceptable (comme demandé dans la question).

  1. Converti une liste de tableaux en chaîne

    arrayList.toString().replace(" ", "")
    
  2. Dans la méthode RetroFit, j'ai changé le paramètre Query qui accepte la liste de tableaux ci-dessus comme suit:

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

Cela garantit que les crochets et les virgules ne sont pas encodés en URL.

4
jarora

L'utilisation de toString n'a pas fonctionné pour moi. Au lieu de cela, TextUtils.join(",", ids) fait l'affaire.

N'oubliez pas de marquer le Query avec encoded = true.

3
Sir Codesalot

Eh bien, cela a fait l'affaire pour moi

Étape 1:

Dans StateServce.kt

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

Étape 2

Lors d'un appel à partir du référentiel

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