有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java改造2,参数转换

下午好!这是请求的谷歌地图服务的URL:

base_url/geocode/json?latlng=10.00,10.00&key=my_api_key

请注意,此请求包含参数latlng,它由两个double组成,用逗号分隔

我想在发出请求时编写更简洁的代码,如下面的代码示例:

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进行请求

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您应该尽可能保持您的服务到域模型。如果您必须转换它的表示,不要直接在服务中使用表示,因为这是传输层的责任。例如,如果有一天您决定改型,或者使用其他不处理字符串的服务,该怎么办?无论如何,假设您有以下纬度/经度域对象(至少必须是这样的):

    final class LatLng {
    
        final double latitude;
        final double longitude;
    
        LatLng(final double latitude, final double longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }
    
    }
    

    您的服务是这样的:

    interface IGeoService {
    
        @GET("geocode/json")
        Call<Void> getAddressByLocation(@Query("latlng") LatLng latLng, @Query("key") String key);
    
    }
    
    private static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(... your service URL here ...)
            .addConverterFactory(new Converter.Factory() {
                @Override
                public Converter<?, String> stringConverter(final Type type, final Annotation[] annotations, final Retrofit retrofit) {
                    // Is it LanLng from the above?
                    if ( !type.equals(LatLng.class) ) {
                        // No, let Retrofit manage this itself
                        return super.stringConverter(type, annotations, retrofit);
                    }
                    // We can convert it ourselves by creating a custom converter from LatLng to String
                    // (No worries about +   javac should be smart enough to use StringBuilder here)
                    return (Converter<LatLng, String>) latLng -> latLng.latitude + "," + latLng.longitude;
                }
            })
            .addConverterFactory(... your basic message converter here ...)
            .build();
    
    final IGeoService geoService = retrofit.create(IGeoService.class);
    geoService.getAddressByLocation(new LatLng(10, 10), "key").execute();
    

    差不多吧。跟踪URL(如果在OkHttpClient输出中被截获):

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

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