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

J'utilise Retrofit et Robospice pour faire des appels API dans mon application android. Toutes les méthodes @POST fonctionnent très bien, tout comme les commandes @GET sans aucun paramètre dans L'URL, mais je ne peux pas obtenir d'appels @GET pour travailler avec des paramètres à la fin!

par exemple, si mon chemin D'API était "my / api / call/" et que je voulais 2 paramètres "param1" et "param2" dans L'URL, l'appel get ressemblerait à:

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

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

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

mais je reçois une erreur disant

" une exception s'est produite pendant l'exécution de la requête réseau : URL query string " /my/api/call?param1={p1}&param2={p2} " sur la méthode getMyThing peut ne pas avoir remplacé le bloc."

Qu'est-ce que je fais de mal?

46
demandé sur jsroyal 2013-11-14 14:19:15

3 réponses

vous devriez utiliser cette syntaxe:

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

spécifier les paramètres de requête dans L'URL est seulement pour quand vous connaissez à la fois la clé et la valeur et ils sont fixés.

106
répondu Jake Wharton 2013-11-14 10:27:56

si vous avez un tas de Params GET, une autre façon de les passer 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

11
répondu juliobetta 2014-11-11 15:17:47

N'écrivez pas vos paramètres de requête dans GET-URL. Faites comme ceci:

@GET("/my/api/call")
Response getMyThing(@Query("param1")
String param1, @Query("param2")
String param2);
6
répondu Christopher 2013-11-14 10:30:30