2016-04-19 5 views
15

Ich verwende einen Abfrageparameter, um die Werte festzulegen, die von der Google Maps API benötigt werden.Nachrüstung 2 - URL-Abfrageparameter

Das Problem ist, ich brauche nicht das & Zeichen für den ersten Abfrageparameter.

@GET("/maps/api/geocode/json?") 
    Call<JsonObject> getLocationInfo(@Query("address") String zipCode, 
              @Query("sensor") boolean sensor, 
              @Query("client") String client, 
              @Query("signature") String signature); 

Retrofit erzeugt:

&address=90210&sensor=false&client=gme-client&signature=signkey 

die den Aufruf bewirkt, dass die fehlschlagen, wenn ich es brauche

address=90210&sensor=false&client=gme-client&signature=signkey 

sein Wie kann ich dieses Problem beheben?

Antwort

20

Wenn Sie @GET("foobar?a=5") angeben, dann muss jede @Query("b") mit & angehängt werden, so etwas wie foobar?a=5&b=7 produzieren.

Wenn Sie ? mit angehängt werden, der Herstellung von so etwas wie foobar?b=7 angeben @GET("foobar"), dann den ersten @Query muss.

So funktioniert Retrofit.

Wenn Sie @GET("foobar?") angeben, Retrofit denkt bereits Sie einige Abfrage-Parameter gab, und fügt mehr Abfrageparameter & verwenden.

Entfernen Sie die ?, und Sie erhalten das gewünschte Ergebnis.

+0

das funktioniert. Haben Sie zufällig gute Ressourcen zur Strukturierung von URLs und allen Arten von Parametern? Ich bin mir nicht sicher, was für ein gutes Keyword zu suchen ist. – Alan

+1

Suchen Sie nach 'URL' und Sie finden https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax – Andreas

7

Ich bin neu zu Retrofit und ich genieße es. Also hier ist ein einfacher Weg, es für diejenigen zu verstehen, die mit mehr als einer Abfrage abfragen möchten: Die? und & werden automatisch für Sie hinzugefügt.

Schnittstelle:

public interface IService { 

     String BASE_URL = "https://api.test.com/"; 
     String API_KEY = "SFSDF24242353434"; 

     @GET("Search") //i.e https://api.test.com/Search? 
     Call<Products> getProducts(@Query("one") String one, @Query("two") String two,  
           @Query("key") String key) 
} 

Es wird auf diese Weise aufgerufen werden. Bedenkt, dass du den Rest des Codes bereits erledigt hast.

Call<Results> call = service.productList("Whatever", "here", IService.API_KEY); 

Zum Beispiel, wenn eine Abfrage zurückgegeben wird, wird es so aussehen.

//-> https://api.test.com/Search?one=Whatever&two=here&key=SFSDF24242353434 
0

öffentliche Schnittstelle IService {

String BASE_URL = "https://api.demo.com/"; 

    @GET("Login") //i.e https://api.demo.com/Search? 
    Call<Products> getUserDetails(@Query("email") String emailID, @Query("password") String password) 

}

Es wird auf diese Weise aufgerufen werden. Bedenkt, dass du den Rest des Codes bereits erledigt hast.

Anruf call = service.authenticateUser ("[email protected]", "Password @ 123");

Zum Beispiel, wenn eine Abfrage zurückgegeben wird, wird es so aussehen.

// ->https://api.demo.com/[email protected]&[email protected]