2013-11-14 12 views
40

Ich verwende Retrofit und Robospice, um API-Aufrufe in meiner Android-Anwendung zu machen. Alle @POST-Methoden funktionieren hervorragend, und auch @GET-Befehle ohne Parameter in der URL, aber ich kann keine @GET-Aufrufe erhalten, um mit Parametern am Ende zu arbeiten!Nachrüstung: mehrere Abfrageparameter im @ GET-Befehl?

Zum Beispiel, wenn mein API-Pfad "mein/api/Anruf /" war und ich wollte 2 Parameter "param1" und "param2" in der URL, würde die get Aufruf wie folgt aussehen:

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

so habe ich mein Setup @ abrufen Schnittstelle wie folgt:

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

aber ich erhalte eine Fehlermeldung, dass
„eine Ausnahme bei der Anfragenetzausführung aufgetreten: URL-Abfragezeichenfolge“ /my/api/call?param1={p1}&param2={p2} "auf Verfahren getMyThing nicht repla hat Ced Block. "

Was mache ich falsch?

Antwort

98

sollten Sie diese Syntax verwenden:

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

Abfrageparameter angeben in der URL nur für ist, wenn Sie sowohl den Schlüssel und den Wert kennen und sie fixiert sind.

+2

sein Ich bin jetzt die folgende Fehlermeldung erhalten: 11-14 10: 29: 48,626: E // RequestRunner.java: 134 (31776): 10.29: 48.630 Thread-11782 Während der Ausführung des Anforderungsnetzwerks ist eine Ausnahme eingetreten: null Ich stelle die Schnittstelle definitiv in meinem Spicemanager ein, nicht sicher, was null sein könnte ... – AndroidNoob

+2

Ich bin mir nicht sicher, sorry. Ich habe RoboSpice nie benutzt. Ich bin nur hier für das Retrofit :) –

+0

Hallo Jake, das würden wir perfekt in dem Szenario, in dem Sie die Abfrage Params selbst konstruieren müssen, aber was ist, wenn sie Ihnen zuvor gegeben sind? Stellen Sie sich eine Template-Antwort vor, die Ihnen mitteilt, wo Sie die Informationen abholen können und welche Parameter Sie einstellen müssen. So/my/api/call? Param1 = {p1} & param2 = {p2} wird von Ihnen nicht manuell erstellt, sondern Ihnen in der Antwort eines anderen Anrufs zur Verfügung gestellt. –

5

Schreiben Sie nicht Ihre Abfrageparameter in GET-URL. Machen Sie es wie folgt aus:

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

Wenn Sie eine Reihe von GET params haben, eine andere Art und Weise sie in Ihre URL zu übergeben ist eine 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. 
     }); 
    } 
} 

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