下午好!这是 Google地图服务的请求网址:
base_url/geocode/json?latlng=10.00,10.00&key=my_api_key
请注意,此请求包含参数latlng
,该参数由两个double
组成,以逗号分隔。
我想在make请求时编写更紧凑和简洁的代码,就像在此代码示例中一样:
mMapsGeocodeApi.getAddressByLocation(
location.getLat(),
location.getLng(),
API_KEY);
但是,参数latLng
- 不是两个双变量,我不能编写代码,这需要两个变量。在将变量提供给请求方法之前,我必须将double
转换并合并到String
。但这看起来很糟糕......
此时,用接口编写的方法,如下代码插图:
@GET("geocode/json")
void getAddressByLocation(@Query("latlng") String latLng,
@Query("key") String key);
我如何创建方法,它采用两个double
变量,将它们转换为String
(在此方法内),而不是使用参数latlng
执行请求。另外,我如何在请求的类(而不是当前界面)MapsGeocodeApi
中使用Retrofit进行此操作?
P.S。我知道,如何使用第三方方法,但我想知道它是如何在课堂上制作的,这需要Retrofit
来提出请求。
谢谢!
答案 0 :(得分:3)
您应该尽可能地保持对域模型的服务。如果必须转换其表示形式, - 不要直接在服务中使用表示形式,因为它是传输层的责任。例如,如果您决定有一天从Retrofit切换或使用不处理字符串的其他服务,该怎么办?无论如何,假设您有以下纬度/经度域对象(至少它必须是这样的):


 final class LatLng {

最终双倍纬度;
最终双倍经度;

 LatLng(最终双倍纬度,最终双倍经度){
 this.latitude =纬度;
 this.longitude =经度;
 }

}



 您的服务是这样的:

& #xA; interface IGeoService {

 @GET( “地理编码/ JSON”)
调用<无效> getAddressByLocation(@Query(“latlng”)LatLng latLng,@ Query(“key”)String key);

}


&# xA; private static final Retrofit retrofit = new Retrofit.Builder()
 .baseUrl(...这里的服务网址...)
 .addConverterFactory(new Converter.Factory(){
 @Override
 public Converter<?,String> stringConverter(final Type type,final Annotation [] annotations,final Retrofit retrofit){
 // Is它来自上面的LanLng?
 if(!type.equals(LatLng.class)){
 //不,让Retrofit自己管理
返回super.stringConverter(类型,注释,改造) ;
}
 //我们可以通过创建从LatLng到String
 //的自定义转换器来自行转换它(不用担心+ - javac应该足够聪明,可以在这里使用StringBuilder)&# xA; return(转换器< LatLng,String>)latLng - > latLng.latitude +“,”+ latLng.longitude;
}
})
 .addConverterFactory(...这里你的基本消息转换器......)
 .build();



 final IGeoService geoService = retrofit.create(IGeoService .class);
 geoService.getAddressByLocation(new LatLng(10,10),“key”)。execute();

&#xA;&#xA; < p>这样的事情。跟踪的URL(如果在 OkHttpClient
中截获)输出:&#xA;&#xA; &#xA;&#xA;&#xA;http:// whatever / geocode / json?latlng = 10.0,10.0&amp; key = key
&#xA;
顺便说一下,您可以从界面中删除 key
参数,因为 key
参数可以在拦截器中动态添加。