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?

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.


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


@ 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


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("abc@gmail.com", "Password@123");

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

https://api.demo.com/Login?email=abc@gmail.com&password=Password@123

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.