Nachrüstung 2 - URL-Abfrageparameter

72

Ich verwende Abfrageparameter, um die von der Google Maps-API benötigten Werte festzulegen.

Das Problem ist, dass ich das &Vorzeichen für den ersten Abfrageparameter nicht benötige .

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

Nachrüstung erzeugt:

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

was dazu führt, dass der Anruf fehlschlägt, wenn ich ihn brauche

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

Wie behebe ich das?

Alan
quelle

Antworten:

102

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

Wenn Sie angeben @GET("foobar"), @Querymuss der erste mit angehängt werden ?, um so etwas wie zu erzeugen foobar?b=7.

So funktioniert Retrofit.

Wenn Sie angeben @GET("foobar?"), glaubt Retrofit, dass Sie bereits einige Abfrageparameter angegeben haben, und hängt weitere Abfrageparameter mit an &.

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

Andreas
quelle
das funktioniert. Haben Sie zufällig gute Ressourcen zur Strukturierung von URLs und zu allen Arten von Parametern? Ich bin mir nicht sicher, nach welchem ​​guten Schlüsselwort ich suchen soll.
Alan
1
Suchen Sie nach URLund Sie finden en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax
Andreas
@ Arbaz.in Dann schlage ich vor, dass Sie auf die Schaltfläche "Frage stellen" in der oberen rechten Ecke klicken.
Andreas
57

Ich bin neu in der Nachrüstung und ich genieße es. Hier ist eine einfache Möglichkeit, dies für diejenigen zu verstehen, die möglicherweise 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 so genannt. In Anbetracht dessen, dass Sie den Rest des Codes bereits erledigt haben.

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

Wenn beispielsweise eine Abfrage zurückgegeben wird, sieht sie folgendermaßen aus.

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

Link für das vollständige Projekt: Bitte Stern usw .: https://github.com/Cosmos-it/ILoveZappos

Taban-Kosmos
quelle
Wie kann ich die vollständige Abfragezeichenfolge mit Parametern für Anfragen wie diese sehen / protokollieren?
Evgeny Fedin
Ich bin mir nicht ganz sicher, wie ich diese Frage beantworten soll. Versuchen Sie, ein Methodenergebnis zu protokollieren, das z. getProducts, damit Sie das Protokoll sehen können? Weil du das auf viele Arten tun kannst. Ich habe das nicht implementiert, aber hier ist ein Projekt, das ich vor einiger Zeit Retrofit implementiert habe. Zu Ihrer Information, nicht überprüft. github.com/Cosmos-it/ILoveZappos
Taban Cosmos
13
 public interface 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 so genannt. In Anbetracht dessen, dass Sie den Rest des Codes bereits erledigt haben.

Call<Results> call = service.getUserDetails("[email protected]", "Password@123");

Wenn beispielsweise eine Abfrage zurückgegeben wird, sieht sie folgendermaßen aus.

https://api.demo.com/[email protected]&password=Password@123
Keshav Gera
quelle
2
Wo ist authenticateUser definiert /
IgorGanapolsky
Ich möchte ID am Ende wie 192.168.1.1/demo/api/memberlist/6557
Arbaz.in
1
@ Arbaz.in / memberlist / {id} und setze @Path ("id") in deiner Funktion.
MoxGeek