改造2-URL查询参数


72

我正在使用查询参数来设置Google Maps API所需的值。

问题是我不需要&第一个查询参数的符号。

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

改造产生:

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

当我需要它时会导致呼叫失败

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

我该如何解决?

Answers:


102

如果指定@GET("foobar?a=5"),则@Query("b")必须使用附加任何内容&,产生类似的内容foobar?a=5&b=7

如果指定@GET("foobar"),则@Query必须使用附加第一个?,产生类似的内容foobar?b=7

这就是改造的工作方式。

当您指定时@GET("foobar?"),Retrofit认为您已经提供了一些查询参数,并使用附加了更多查询参数&

删除?,您将获得所需的结果。


这可行。您是否有关于URL的结构和所有类型的参数的良好资源?我不确定要搜索什么关键字。
艾伦(Alan)


@ Arbaz.in然后,我建议您单击右上角的“询问问题”按钮。
安德烈亚斯(Andreas)

57

我是新手,现在很开心。因此,对于那些可能希望使用多个查询进行查询的人来说,这是一种理解它的简单方法:和&将自动为您添加。

接口:

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

它将被称为这种方式。考虑到您已经完成了其余的代码。

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

例如,当返回查询时,它将看起来像这样。

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

完整项目的链接:请加星号:https : //github.com/Cosmos-it/ILoveZappos


我如何才能看到/记录具有此类请求参数的完整查询字符串?
Evgeny Fedin

我不太确定如何回答这个问题。您是否正在尝试记录具有例如的方法结果。getProducts,以便您可以查看日志?因为你可以做很多事情。我没有实现,但是这是我不久前实现Retrofit的项目。仅供参考,未经审核。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)

} 

它将被称为这种方式。考虑到您已经完成了其余的代码。

Call<Results> call = service.getUserDetails("abc@gmail.com", "Password@123");

例如,当返回查询时,它将看起来像这样。

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

2
authenticateUser定义在哪里/
IgorGanapolsky,2018年

我想在末尾传递ID,例如192.168.1.1/demo/api/memberlist/6557
Arbaz.in

1
@ Arbaz.in / memberlist / {id}并在函数中设置@Path(“ id”)。
MoxGeek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.