wake-up-neo.com

Retrofit: mehrere Abfrageparameter im @GET-Befehl?

Ich benutze Retrofit und Robospice, um API-Aufrufe in meiner Android-Anwendung durchzuführen. Alle @POST-Methoden funktionieren hervorragend und @GET-Befehle auch ohne Parameter in der URL. Ich kann jedoch keine @GET-Aufrufe erhalten, um am Ende mit Parametern zu arbeiten! 

Wenn mein API-Pfad beispielsweise "mein/api/call /" war und ich zwei Parameter "param1" und "param2" in der URL haben wollte, würde der get-Aufruf folgendermaßen aussehen:

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

also habe ich meine @GET-Schnittstelle so eingerichtet:

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

aber ich bekomme eine Fehlermeldung 
"Während der Ausführung des Anforderungsnetzwerks ist eine Ausnahme aufgetreten: Die URL-Abfragezeichenfolge" /my/api/call?param1={p1}&param2={p2} "für die Methode getMyThing hat möglicherweise keinen Block ersetzt.

Was mache ich falsch?

48
AndroidNoob

Sie sollten diese Syntax verwenden:

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

Die Angabe von Abfrageparametern in der URL gilt nur, wenn Sie sowohl den Schlüssel als auch den Wert kennen und diese festgelegt sind.

109
Jake Wharton

Wenn Sie eine Reihe von GET-Parametern haben, können Sie sie auch mit einer HashMap an Ihre URL übergeben.

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.
       });
    }
}

Die aufgerufene URL lautet http://www.example.com/thing/?foo=bar&baz=qux

13
Julio Betta

Schreiben Sie Ihre Abfrageparameter nicht in GET-URL. Mach es so:

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

Sie können eine Map of Params erstellen und wie folgt senden:

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