我尝试了两种类型的值传递到Android Retrofit库中的URL,方法1执行没有任何错误,但方法2抛出错误。
我在方法1中通过查询键名发送参数值,并在方法2中使用变量替换API端点
方法2引发的错误:
java.lang.IllegalArgumentException: URL query string "appid={apikey}&lat={lat}&lon={lon}&units={units}" must not have replace block. For dynamic query parameters use @Query.
我的网址是:数据/2.5/天气?纬度=77.603287&lon=12.97623&appid=f5138&units=公制
方法一:(执行良好)
@GET("data/2.5/weather")
Call<Weather> getWeatherReport(@Query("lat") String lat,
@Query("lon") String lng,
@Query("appid") String appid,
@Query("units") String units);
方法2:(错误)
@GET("data/2.5/weather?appid={apikey}&lat={lat}&lon={lon}&units={units}")
Call<Weather> getWeatherReport1(@Query("apikey") String apikey,
@Query("lat") String lat,
@Query("lon") String lng,
@Query("units") String units);
我在第二种方法中也尝试了@Path。
我的问题是1.这两种方法有什么区别?2.为什么第二种方法不起作用?
4条答案
按热度按时间2ledvvac1#
第二种方法行不通
URL查询字符串不能有替换块。对于动态查询参数,请使用@Query
所以在这种情况下使用@Path注解也不起作用。您可以像第一个方法那样使用@Query注解动态地分配查询参数。您可以像下面这样使用@Path注解动态地仅应用Path参数
yv5phkfx2#
第一种方法是在查询字符串中发送参数(HTTP url参数),第二种方法是作为路径参数发送(REST)。
有关更多信息,请查看此处:https://en.wikipedia.org/wiki/Query_string
Rest Standard: Path parameters or Request parameters
因此,如果端点支持路径参数,则第二个方法应为:
5kgi1eie3#
正如错误所建议的,您不能将动态查询参数放置在url查询字符串中。
替换块,即{}必须与路径参数一起使用。您混淆了无效的查询和路径参数,因此出现错误。
正如Agustin建议的那样,如果端点支持路径参数,请使用他提供的方法
50few1ms4#
URL操作
可以使用方法上的替换块和参数动态更新请求URL。替换块是一个由{和}包围的字母数字字符串。必须使用相同字符串的@Path对相应参数进行注解。
还可以添加查询参数。
对于复杂的查询参数组合,可以使用Map。