在“设置”中配置RetroFit BASE URL

时间:2016-04-14 11:54:52

标签: android retrofit2

我有一个应用程序将部署到不同站点的多个客户。它使用RetroFit与服务器产品进行通信。

问题是每个客户都会在自己的本地服务器上部署此服务器产品,并使用自己的BASE_URL,因此BASE_URL无法硬编码到应用程序中。在现场部署应用程序时,需要为每台设备配置它,而不是为每个客户构建应用程序。

我创建了一个设置屏幕,其中包含一个字段,用于编辑BASE_URL并将其存储在SharedPreferences中。我的问题是:是否可以使用SharedPreferencesCall的此值替换BASE_URL?

实际上,它不一定是SharedPreferences。我只需要能够配置BASE_URL并将其存储在任何地方。即使将文件存储在SD卡上也可能就足够了。

有没有人有任何建议? 感谢。

更新:这是我的客户代码:

public class RestClient {
    private static RestInterface REST_CLIENT;
    private static final String API_BASE_URL = "http://myurl/";

    static {
        setupRestClient();
    }

    private RestClient() {
    }

    public static RestInterface get() {
        return REST_CLIENT;
    }

    private static void setupRestClient() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        REST_CLIENT = retrofit.create(RestInterface.class);
    }
}

感谢。

1 个答案:

答案 0 :(得分:1)

以下是我的解决方案:

public class RestClient {
    private static RestInterface REST_CLIENT;
    private static final String API_BASE_URL = "http://myurl/";

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    public static RestInterface get(@NonNull Context context) {
        if (null == REST_CLIENT) {
            setupRestClient(context);
        }
        return REST_CLIENT;
    }

    private static void setupRestClient(@NonNull Context context) {

        String baseUrl = CustomPrefs.getInstance(context).getEndpointBaseUrl();
        httpClient.addInterceptor(getInterceptorWithAuth(context));
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(httpClient.build())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        REST_CLIENT = retrofit.create(RestInterface.class);
    }

    private static Interceptor getInterceptorWithAuth(@NonNull final Context context) {
        final String username = CustomPrefs.getInstance(context).getHttpUsername();
        final String password = CustomPrefs.getInstance(context).getHttpPassword();
        final String credentials = username + ":" + password;
        final String basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);

        return new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request original = chain.request();

                Request.Builder requestBuilder = original.newBuilder()
                        .header("Authorization", basic)
                        .header("Accept", "application/json")
                        .header("User-Agent", "myApp")
                        .method(original.method(), original.body());

                Request request = requestBuilder.build();
                return chain.proceed(request);
            }
        };
    }
}

我还在HTTP Basic Auth中添加了。 如果您不需要验证,请删除httpClientgetInterceptorWithAuth()方法。

用法:

call = RestClient.get(context).whateverMethod();