Android - Проблемы с управлением конечными точками сервера в клиенте приложения

У меня есть следующие URL сервера:

Сервер базы-URL / method1
Сервер базы-URL / method2
Сервер базы-URL / method3
...
Сервер базы-URL / method100

В настоящее время я использую файл свойств для хранения URL-адресов. Когда мне нужно использовать некоторые URL-адреса сервера, я читаю файл свойств и выполняю http-запрос с помощью Spring 4 Android

Я знаю, что это должен быть другой способ (и лучший способ) сделать это. Какова лучшая практика для достижения этой цели?

4 ответа

Решение

Другой вариант заключается в использовании простой Java:

public class ServerInfo {
     private static final String URL_BASE_DEBUG = "your base debug url";
     private static final String URL_BASE_RELEASE = "your base release url";

     public static String getBaseUrl() {
          //change if debug' release or whichever flavor
          return URL_BASE_DEBUG;
     } 
}

Это довольно просто... Вы можете иметь всю необходимую информацию в одном Java Class

Теперь о сетевой связи. Это действительно зависит от вас... Есть много вариантов... Мне лично нравится Retrofit 2, который является оберткой поверх сетевой библиотеки.

Краткий пример того, как вы можете использовать Retrofit с помощью вышеуказанного метода является:

Rest Api (например, User Rest api)

public interface SomeRestApiEndPoints {
    @GET("api/method1")
    Call<ReturnValue> method1(params);

    @POST(api/method2)
    Call<ReturnObject> method2(params);
    ...
}

Клиент Отдыха

public class RestClient {
   private static RestClient sRestClient;

   private Retrofit mRetrofit;
   private SomeRestApiEndPoints apiEndpoint;

   public static RestClient getRestClient () {
        if(sRestClient != null){
            return sRestClient;
        }

        synchronized (RestClient.class) {
            if(sRestClient == null) {
            //gson example
            Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
            RestClient client = new RestClient();
            client.mRetrofit = new Retrofit.Builder()
                    .baseUrl(ServerInfo.getBaseUrl()) //This is where you bind the base Url
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();     

            client.apiEndpoint = client.mRetrofit.create(SomeRestApiEndPoints.class);
            sRestClient = client;
        }
        return sRestClient;
    }


    public SomeRestApiEndPoints getApi() {
        return apiEndpoints;
    }

}

Пример использования

Call<ReturnValue> call = RestClient.getRestClient().getApi().method1(params);

Определенно я пойду с ресурсами Android под значениями в виде строки. поэтому вы называете его один раз и получаете все преимущества мощных инструментов Android-студии для настройки и локализации по локали, типу сборки и разновидностям... Я бы просто предложил установить URL-адреса в отдельном файле. т.е. urls.xml

    <resources>
        <string name="url_server1">http://apipas.com/gloabl/server1</string>
        <string name="url_server2">http://apipas.com/global/server2</string>
    </resources>

Для простого проекта это может не иметь значения... но когда вы работаете с корпоративным или с несколькими целями, несколькими языками, различными уровнями сервера (в зависимости от местоположения; ЕС / Азия... или по использованию: бесплатно / платно) или на этапе: dev / testing / production) будет иметь решающее значение способ управления ресурсами, например ресурсами.

Позвольте мне уточнить, что... допустим, у нас есть этот build.gradle для приложения:

buildTypes {
    debug {
        debuggable false
        applicationIdSuffix 'debug'
    }
    qa {
        debuggable false
        applicationIdSuffix 'qa'
    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

productFlavors {
    paid {
        applicationId = "com.apipas.android.wellmanagerurlsapp.paid"
    }
    free {
        applicationId = "com.apipas.android.wellmanagerurlsapp.free"
    }
}

Также поддерживает немецкий язык и австралийский язык en-rAU

Итак, у нас есть эти факторы настройки:

  • Вкус: платный / бесплатный (может быть что-то еще: арка процессора, регионы и т. Д.)
  • BuildType: в дополнение к Release и Debug я добавил QA для тестирования приложения с тестовым сервером, если он доступен.
  • Локации: база, де, & en-rAU

Все, что вам нужно сделать, это просто переопределить res в правильном месте, которое соответствует тому, что вам нужно для достижения

Допустим, я бы использовал базу buildType для настройки URL:

введите описание изображения здесь

Или вы бы использовали ароматы:

введите описание изображения здесь

Будьте внимательны, чтобы не допустить дублирования, когда используете flavor и buildType вместе для настройки res.

В процессе разработки вам не нужно менять имя URL-адреса... это действительно хороший момент, когда у вас большой проект. Тем не менее, вы можете легко изменить содержимое для любого вкуса / buildType / locale

Вы также можете использовать JSON, XML или свойства, как вы указали. но никто из них не даст вам того, что делают res.

Удачи,'.

Я использую для создания параметров URL в build.gradle файл в зависимости от buildType. Это стратегия, которой следует великий iosched проект.

Первое, что нужно сделать, это добавить в свой gradle.propeties подать ваши строки:

# Website hostname
dev_website_host_name = devUrl.com 
production_website_host_name = productionUrl.com 

После этого в вашем build.gradle подайте это например:

buildTypes {
    debug {
        debuggable true
        minifyEnabled false
        signingConfig signingConfigs.debug
        resValue("string", "website_host_name", "${dev_website_host_name}")
    }
    release {
        debuggable false
        minifyEnabled true
        // No signing config as we do this separately.
        proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt')
        resValue("string", "website_host_name", "${production_website_host_name}")
    }
}

Grade создаст строковый ресурс с именем website_host_nameи в зависимости от типа вашей сборки будет иметь одно или другое значение. Чтобы получить доступ к этому значению по коду, просто введите R.string.website_host_name и это все!!

Так я работаю с разными типами сборки в разных средах. Проекты Google всегда являются хорошим ориентиром.

Лучший способ сделать это - использовать клиент REST API. Я бы порекомендовал вам использовать Retrofit.

Правильное руководство, чтобы узнать, как его использовать, можно найти здесь.

Другие вопросы по тегам