Development for Android
26 June 2014

Библиотека Android Data Processor для легкого построения REST запросов и их обработки

В повседневной работе постоянно сталкиваюсь с разработкой приложений использующих REST сервисы. Существующие библиотеки помогающие в построении запросов и их обработку не слишком меня устраивали по ряду причин. Возникла мысль о создании простого инструмента наподобие Universal Image Loader позволяющего быстро строить запросы и парсить полученные данные. В результате появился Android Data Processor

Процессор данных предназначен для выполнения REST запросов к сервисам или локально к файлам.
Запросы могут выполнятьс синхронно или асинхронно. Процессор не содержит парсеров. Для обработки результатов вы используете свои любимые парсеры данных и передаете им полученные данные в виде InputStream, String.

Инициализация процессора

Для использования процессора необходиомо его инициализировать при помощи конфигуратора. Конфигуратор позволяет задать основные параметры запроса согласно http://developer.android.com/reference/java/net/URL.html, encoding, timeout и т.д. Эти данные являются базовыми и могут без проблемно модифицироваться при построении конкретных запросов. Инициализацию удобнее всего выполнять в классе наследованном от Application:

	private void initDataProcessor() {
		DataProcessorConfiguration configuration = DataProcessorConfiguration
				.getBuilder()
				.setHost("google.com")
				.setLogEnabled(true)
				.setShowProcessingTime(true)
				.setTimeout(4000)
				.build();
		DataProcessor.getInstance().init(configuration);
	}

Запросы

В данный момент возможно конструирование GET, POST, MultipartRequest а также обработка локальных файлов.

Создание запроса


Request request = GetRequest.newInstance()
				.setLogTag("FB Login to server")
				.addGetParam("signature", "DH$FHJDDBHJV3393n")
				.setPath("login.php")
				.build();



Request request = PostRequest.newInstance()
				.addPostParam("email", "some@gmail.com")
				.addPostParam("password", "any_password")
				.setLogTag("Login to server")
				.addGetParam(VAR_SIG, SIGNATURE)
				.setPath("auth2.php")
				.build();



Request request = MultipartRequest.newInstance()
				.addTextBody("userName", "Alex")
				.addTextBody("email", "some@gmail.com")
				.addTextBody("password", "any_password")
				.addTextBody("sex", "male")
				.addJPEG("imagedata", bitmap, "image.jpg")
				.setLogTag("Create user")
				.addGetParam(VAR_SIG, SIGNATURE)
				.setPath("createuser.php")
				.build();


Обработка результатов запроса и их размещение в объекте

Полученные данные запроса могут быть обработаны любым вашим любимым парсером. Обработанные данные размещаются в объектах реализующий интерфейсы InputStreamDataInterface, StringDataInterface.


public class LoginResult  implements StringDataInterface {

	public static String		token				= "";
	public static String		email				= "";
	public static String		password			= "";

	@Override
	public void fillFromString(String src) throws Exception {
		JSONObject jsonObject = new JSONObject(src);
		token = jsonObject.getString("token");
		email = jsonObject.getString("email");
		password = jsonObject.getString("password");
	}


Выполнение запроса и получение результатов

Выполнение запроса может быть синхронным или асинхронным. Синхронный запрос возвращает непосредственно заполненный объект создаваемый в случае успешного запроса. Асинхронный запрос возвращает такой же объект или Exception в случае проблем через Callback.


DataProcessor.getInstance().executeAsync(request, LoginResult.class, handler);


Пример обработки в Callback:

	
private DataProcessor.Callback callback = new DataProcessor.Callback() {

                                              @Override
                                              public void onFinish(Object obj, int what) {
                                                 if (what == HttpStatus.SC_OK) {
                                                    ... успешные действия
                                                 } else {
                                                    Exception ex = (Exception) obj;
                                                    if (ex instanceof IOException) {
                                                       Log.e("IO Error", ex);
                                                    } else {
                                                       Log.e("Error", ex);
                                                    }
                                                 }
                                              }
                                           };


Пример приложения можно посмотреть по ссылке

+10
6.9k 89
Comments 18