在Android Retrofit库中将值传递到URL的差异

0aydgbwb  于 2023-01-03  发布在  Android
关注(0)|答案(4)|浏览(142)

我尝试了两种类型的值传递到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.为什么第二种方法不起作用?

2ledvvac

2ledvvac1#

第二种方法行不通
URL查询字符串不能有替换块。对于动态查询参数,请使用@Query
所以在这种情况下使用@Path注解也不起作用。您可以像第一个方法那样使用@Query注解动态地分配查询参数。您可以像下面这样使用@Path注解动态地仅应用Path参数

@GET("data/{version}/")
Call<Weather> getWeatherReport1(@Path("version") String version);
yv5phkfx

yv5phkfx2#

第一种方法是在查询字符串中发送参数(HTTP url参数),第二种方法是作为路径参数发送(REST)。
有关更多信息,请查看此处:https://en.wikipedia.org/wiki/Query_string
Rest Standard: Path parameters or Request parameters
因此,如果端点支持路径参数,则第二个方法应为:

@GET("data/2.5/weather?appid={apikey}&lat={lat}&lon={lon}&units={units}")
Call<Weather> getWeatherReport1(@Path("apikey") String apikey,
                               @Path("lat") String lat,
                               @Path("lon") String lng,
                               @Path("units") String units);
5kgi1eie

5kgi1eie3#

正如错误所建议的,您不能将动态查询参数放置在url查询字符串中。
替换块,即{}必须与路径参数一起使用。您混淆了无效的查询和路径参数,因此出现错误。
正如Agustin建议的那样,如果端点支持路径参数,请使用他提供的方法

50few1ms

50few1ms4#

URL操作
可以使用方法上的替换块和参数动态更新请求URL。替换块是一个由{和}包围的字母数字字符串。必须使用相同字符串的@Path对相应参数进行注解。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

还可以添加查询参数。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

对于复杂的查询参数组合,可以使用Map。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

相关问题