web-dev-qa-db-fra.com

Retrofit: plusieurs paramètres de requête dans la commande @GET?

J'utilise Retrofit et Robospice pour passer des appels d'API dans mon application Android. Toutes les méthodes @POST fonctionnent très bien, de même que les commandes @GET sans aucun paramètre dans l'URL, mais je ne parviens pas à faire appel à @GET pour qu'il fonctionne avec des paramètres! 

Par exemple, si mon chemin d'accès à l'API était "mon/api/call /" et si je voulais 2 paramètres "param1" et "param2" dans l'URL, l'appel get ressemblerait à ceci:

http://www.example.com/my/api/call?param1=value1&param2=value2

j'ai donc configuré mon interface @GET comme suit:

@GET("/my/api/call?param1={p1}&param2={p2}")
Response getMyThing(@Path("p1")
String param1, @Path("p2")
String param2);

mais je reçois une erreur en disant 
"Une exception s'est produite lors de l'exécution du réseau de requêtes: la chaîne de requête URL" /my/api/call?param1={p1}&param2={p2} "de la méthode getMyThing n'a peut-être pas remplacé le bloc."

Qu'est-ce que je fais mal?

48
AndroidNoob

Vous devriez utiliser cette syntaxe:

@GET("/my/API/call")
Response getMyThing(
    @Query("param1") String param1,
    @Query("param2") String param2);

La spécification de paramètres de requête dans l'URL ne s'applique que si vous connaissez à la fois la clé et la valeur et qu'elles sont fixes.

109
Jake Wharton

Si vous avez plusieurs paramètres GET, un autre moyen de les transférer dans votre URL est un HashMap.

class YourActivity extends Activity {

    private static final String BASEPATH = "http://www.example.com";

    private interface API {
        @GET("/thing")
        void getMyThing(@QueryMap Map<String, String>, new Callback<String> callback);
    }

    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.your_layout);

       RestAdapter rest = new RestAdapter.Builder().setEndpoint(BASEPATH).build();
       API service      = rest.create(API.class);

       Map<String, String> params = new HashMap<String, String>();
       params.put("foo", "bar");
       params.put("baz", "qux");
       // ... as much as you need.

       service.getMyThing(params, new Callback<String>() {
           // ... do some stuff here.
       });
    }
}

L'URL appelée sera http://www.example.com/thing/?foo=bar&baz=qux

13
Julio Betta

N'écrivez pas vos paramètres de requête dans l'URL GET. Fais-le comme ça:

@GET("/my/api/call")
Response getMyThing(@Query("param1")
String param1, @Query("param2")
String param2);
6
Christopher

Vous pouvez créer une carte de paramètres et l'envoyer comme ci-dessous:

Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("p1", param1);
paramsMap.put("p2", param2);

// Inside call
@GET("/my/api/call")
Response getMyThing(@QueryMap Map<String, String> paramsMap);
0
Ankit Bisht