ПЗ (1194863), страница 5
Текст из файла (страница 5)
2.3.3.2 Отправка HTTP запроса посредством AsyncTask
Для начала необходимо определить наследник класса AsyncTask. Именно в нем будет происходить отправка запросов к серверу и получение данных. Для осуществления поставленной задачи необходимо описать HTTP запрос. Также в файл androidmanifest.xml необходимо добавить строку <uses-permission android:name="android.permission.INTERNET"/>. Данное разрешение дает возможность мобильному приложению использовать соединение с интернетом.
Следующим шагом необходимо отправить запрос на получение данных по указанному в коде URL адресу. Так как предварительно была подключена библиотека Apache, используется метод makeHttpRequest, позволяющий отправить GET-запрос на получение данных. Данные метод является основной операцией, выполняемой в методе doInBackground асинхронной задачи.
Данные на сервере хранятся в виде JSON-документа. Для использования полученных данных необходимо конвертировать JSON-документ в объект, с которым Android сможет работать.
2.3.3.3 Работа с JSON-документом
JSON-документ представляет собой набор пар вида «ключ: значение» [21]. В различных языках это реализовано как объект, запись, структура, словарь, хэш-таблица, список с ключом или ассоциативный массив. Ключом может быть только строка, значением – любая форма. JSON-документ является универсальной структурой данных. Все современные языки программирования поддерживают его в той или иной форме.
В JSON используются следующие формы:
– объект – неупорядоченное множество пар имя/значение, заключенное в фигурные скобки {};
– массив (одномерный) – это множество значений, имеющих порядковые номера (индексы);
– значение – может быть строкой в двойных кавычках, числом, значением true или false, объектом, массивом или значением null;
– строка – упорядоченное множество из нуля или более символов юникода, заключенное в двойные кавычки;
– имя – это строка.
Пример JSON-документа представлен на рисунке 24.
Рисунок 24 – Пример JSON-документа
Данные, передающиеся с сервера, хранятся в виде JSON-документов, однако для того, чтобы работать с полученными данными в Android их нужно представить в виде объектов [22]. Получение данных представлено на листинге 1.
| 1 | * Получаем все продукт из url |
| 2 | protected String doInBackground(String... args) { |
| 3 | // Будет хранить параметры |
| 4 | List<NameValuePair> params = new ArrayList<NameValuePair>(); |
| 5 | // получаем JSON строк с URL |
| 6 | JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params); |
| 7 | Log.d("All Products: ", json.toString()); |
| 8 | try { |
| 9 | // Получаем SUCCESS тег для проверки статуса ответа сервера |
| 10 | int success = json.getInt(TAG_SUCCESS); |
| 11 | if (success == 1) { |
| 12 | // продукт найден |
| 13 | // Получаем массив из Продуктов |
| 14 | products = json.getJSONArray(TAG_PRODUCTS); |
| 15 | // перебор всех продуктов |
| 16 | for (int i = 0; i < products.length(); i++) { |
| 17 | JSONObject c = products.getJSONObject(i); |
| 18 | // Сохраняем каждый json елемент в переменную |
| 19 | String id = c.getString(TAG_PID); |
| 20 | String name = c.getString(TAG_NAME); |
| 21 | String logo = c.getString(TAG_LOGO); |
| 22 | // Создаем новый HashMap |
| 23 | HashMap<String, String> map = new HashMap<String, String>(); |
| 24 | // добавляем каждый элемент в HashMap ключ => значение |
| 25 | map.put(TAG_PID, id); |
| 26 | map.put(TAG_NAME, name); |
| 27 | map.put(TAG_LOGO, logo); |
| 28 | // добавляем HashList в ArrayList |
| 29 | productsList.add(map); |
| 30 | } |
| 31 | } else { |
| 32 | // продукт не найден |
| 33 | // Запускаем Add New Product Activity |
| 34 | Intent i = new Intent(getApplicationContext(), |
| 35 | NewProductActivity.class); |
| 36 | // Закрытие всех предыдущие activities |
| 37 | i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); |
| 38 | startActivity(i); |
| 39 | } |
| 40 | } catch (JSONException e) { |
| 41 | e.printStackTrace(); |
Листинг 1 – Получение JSON-документа
Механизм получения данных включает в метод GET (листинг 2).
| 1 | if(method == "GET"){ |
| 2 | DefaultHttpClient httpClient = new DefaultHttpClient(); |
| 3 | String paramString = URLEncodedUtils.format(params, "utf-8"); |
| 4 | url += "?" + paramString; |
| 5 | HttpGet httpGet = new HttpGet(url); |
| 6 | HttpResponse httpResponse = httpClient.execute(httpGet); |
| 7 | HttpEntity httpEntity = httpResponse.getEntity(); |
| 8 | is = httpEntity.getContent(); |
| 9 | } |
Листинг 2 – Метод GET
После получения JSON-документа проводится парсинг каждого элемента строки JSON в отдельный объект (листинг 3). В случае, если необходимо вывести список элементов, из объектов формируется массив.
| 1 | BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); |
| 2 | StringBuilder sb = new StringBuilder(); |
| 3 | String line = null; |
| 4 | while ((line = reader.readLine()) != null) { |
| 5 | sb.append(line + "\n");} |
| 6 | is.close(); |
| 7 | json = sb.toString(); |
| 8 | } catch (Exception e) { |
| 9 | Log.e("Buffer Error", "Error converting result " + e.toString());} |
| 10 | // пытаемся распарсить строку в JSON объект |
| 11 | try { |
| 12 | jObj = new JSONObject(json); |
| 13 | } catch (JSONException e) { |
| 14 | Log.e("JSON Parser", "Error parsing data " + e.toString());} |
| 15 | // возвращаем JSON строку |
| 16 | return jObj;} |
Листинг 3 – Парсинг JSON-документа
После разбора данные могут быть использованы как любые объекты в Java, например, массив объектов может быть выведен в контейнер ListView.
3 СЕРВЕРНАЯ ЧАСТЬ
3.1 Структура базы данных
Информация, требуемая для получения, хранится в предоставленной базе данных. Для управления базой данных используется система управления базами данных (СУБД) MariaDB [27]. Эта СУБД является ответвлением от проекта MySQL, однако в отличие от СУБД компании Oracle, свободно распространяется сообществом разработчиков (по лицензии GNU GPL). Несмотря на это, MariaDB обеспечивает высокую совместимость с MySQL, в том числе и команд MySQL.
Используемая база данных представляет собой набор таблиц со связями по ключам [25]. Однако для получения данных нужны лишь некоторые таблицы. Поэтому реализована структура базы данных с указанием только использованных таблиц. Ниже представлена ER-диаграмма с указанием используемых таблиц.
Рисунок 25 – ER-диаграмма базы данных
3.1.1 Таблица coupons
Данная таблица является хранит всю основную информацию о купонах:
– название купона;
– скидку, предоставляемую по купону;
– ссылка на логотип магазина, для которого купон предоставляется;
– название магазина;
– дата начала и окончания действия купона.
Для получения информации непосредственно о всех купонах серверу достаточно с помощью SQL-запроса обратиться к полям данной таблицы. Однако, чтобы получить информацию о купонах только определенного магазина или определенной категории, необходимо создать SQL-запрос, который будет представлять из себя выборку с условием, в котором используются внешние ключи company_id и category_id.
3.1.2 Таблица company
Данная таблица предоставляет всю информацию о магазинах, которым предоставляются купоны:
– название магазина;
– web-сайт магазина;
– ссылка на логотип магазина.
Данная таблица используется для получения информации о магазинах. Также, если клиенту нужно осуществить выборку из таблицы coupons с использованием только одного магазина, нужна данная таблица. Между этими двумя таблицами существуют связь: поле company_id таблицы coupons является внешним ключом, связанным с первичным ключом таблицы company.















