В повседневной работе постоянно сталкиваюсь с разработкой приложений использующих REST сервисы. Существующие библиотеки помогающие в построении запросов и их обработку не слишком меня устраивали по ряду причин. Возникла мысль о создании простого инструмента наподобие Universal Image Loader позволяющего быстро строить запросы и парсить полученные данные. В результате появился Android Data Processor
Процессор данных предназначен для выполнения REST запросов к сервисам или локально к файлам.
Запросы могут выполнятьс синхронно или асинхронно. Процессор не содержит парсеров. Для обработки результатов вы используете свои любимые парсеры данных и передаете им полученные данные в виде InputStream, String, JSONObject.
Инициализация процессора
Для использования процессора необходиомо его инициализировать при помощи конфигуратора. Конфигуратор позволяет задать основные параметры запроса согласно 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, JsonDataInterface, StringDataInterface.
public class LoginResult extends BaseResult implements JsonDataInterface {
public static String token = "";
public static String email = "";
public static String password = "";
Override
public void fillFromJSONObject(JSONObject jsonObject) throws JSONException {
if (isSucess(jsonObject)) {
token = jsonObject.getString(«token»);
email = jsonObject.getString(«email»);
password = jsonObject.getString(«password»);
}
}
Выполнение запроса и получение результатов
Выполнение запроса может быть синхронным или асинхронным. Синхронный запрос возвращает непосредсвенно заполненный объект. Асинхронный запрос возвращает такой же объект через Handler в msg.obj а результат (успех или ошибка) в msg.what который может быть равен ProcessingCentre.SUCCESS или ProcessingCentre.ERROR
DataProcessor.getInstance().executeAsync(request, new LoginResult(), handler);
Пример обработки в Handler:
private Handler getLoginHandler() {
return new Handler() {
Override
public void handleMessage(Message msg) {
if (msg.what == ProcessingCentre.SUCCESS) {
LoginResult resultObject = (LoginResult) msg.obj;
…
} else {
Log.w(«Can't login»);
}
}
};
}
Автор: lordtao