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 всегда являются хорошим ориентиром.