改造 2 - URL 查询参数

Posted

技术标签:

【中文标题】改造 2 - URL 查询参数【英文标题】:Retrofit 2 - URL Query Parameter 【发布时间】:2016-08-12 07:44:06 【问题描述】:

我正在使用查询参数来设置 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

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

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

这就是改造的工作原理。

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

删除?,你会得到想要的结果。

【讨论】:

这行得通。你碰巧有关于 url 的结构和所有类型的参数的好资源吗?我不确定要搜索什么好的关键字。 搜索URL,你会找到en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax @Arbaz.in 那我建议你点击右上角的“”按钮。【参考方案2】:

我是改装新手,我很享受它。因此,对于那些可能想要使用多个查询进行查询的人来说,这是一种简单的理解方法: ?和 & 会自动为您添加。

界面:

 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

如果您觉得本文有用,请不要忘记给它加星标。 :)

【讨论】:

如何查看/记录带有此类请求参数的完整查询字符串? 我不太确定如何回答这个问题。您是否尝试记录具有例如的方法结果。 getProducts 以便您可以查看日志?因为你可以做很多事情。我没有实现,但这是我不久前实现的改造项目。仅供参考,未审查。 github.com/Cosmos-it/ILoveZappos 感谢您为我节省了几个小时!从您的 github 项目中,我只是意识到,如果我想在我的调用中添加参数,我需要将我的接口中的 @GET 方法的名称更改为我正在尝试使用的 api 中的方法的名称.【参考方案3】:
 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

【讨论】:

authenticateUser 定义在哪里/ 我想像 192.168.1.1/demo/api/memberlist/6557 这样在末尾传递 id @Arbaz.in /memberlist/id 并在你的函数中设置@Path("id")。

以上是关于改造 2 - URL 查询参数的主要内容,如果未能解决你的问题,请参考以下文章

改造:@GET 命令中的多个查询参数?

改造查询参数采用 & 和 ?一起

获取URL中指定的参数的值 — location.search

使用 Ext JS 版本 4.2.1 读取 URL 中的查询参数

如何从 Angular 2 中的 url 获取查询参数?

将url的查询参数解析成字典对象