web-dev-qa-db-fra.com

Retrofit 2 - Paramètre de requête d'URL

J'utilise des paramètres de requête pour définir les valeurs requises par l'API Google Maps.

Le problème est que je n'ai pas besoin du signe & pour le premier paramètre de requête.

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

La modernisation génère:

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

ce qui provoque l'appel l'échec quand j'en ai besoin

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

Comment puis-je réparer ça?

47
Alan

Si vous spécifiez @GET("foobar?a=5"), toutes les @Query("b") doivent être ajoutées à l'aide de &, produisant un résultat similaire à foobar?a=5&b=7.

Si vous spécifiez @GET("foobar"), le premier @Query doit être ajouté à l'aide de ?, produisant quelque chose comme foobar?b=7.

C'est comme ça que Retrofit fonctionne.

Lorsque vous spécifiez @GET("foobar?"), Retrofit pense que vous avez déjà fourni un paramètre de requête et ajoute les paramètres de requête more à l'aide de &.

Supprimez le ? et vous obtiendrez le résultat souhaité.

72
Andreas

Je suis nouveau à rénover et je l'apprécie. Voici donc un moyen simple de le comprendre pour ceux qui voudraient interroger avec plusieurs requêtes: Le? et & sont automatiquement ajoutés pour vous.

Interface:

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

Cela s'appellera de cette façon. Considérant que vous avez déjà fait le reste du code.

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

Par exemple, lorsqu'une requête est renvoyée, cela ressemblera à ceci.

//-> https://api.test.com/Search?one=Whatever&two=here&key=SFSDF24242353434 
33
Taban Cosmos
 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)

} 

Cela s'appellera de cette façon. Considérant que vous avez déjà fait le reste du code.

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

Par exemple, lorsqu'une requête est renvoyée, cela ressemblera à ceci.

https://api.demo.com/[email protected]&password=Password@123
6
Keshav Gera