改造2,参数转换

时间:2017-05-16 21:40:28

标签: java retrofit2

下午好!这是 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来提出请求。

谢谢!

1 个答案:

答案 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;

http:// whatever / geocode / json?latlng = 10.0,10.0&amp; key = key

&#xA;
&#xA;&#xA;

顺便说一下,您可以从界面中删除 key 参数,因为 key 参数可以在拦截器中动态添加。

&#xA;