Привет всем хабровчанам!
Сразу хочу сказать, что, хотя тема не «Hello world», но рассматриваемая задача довольно проста и приведена здесь на Хабре скорее в качестве средства экономии времени для разработчиков, которым, возможно, надо будет поработать с XML-ответами от web-сервисов. Для XML-разбора я использовал DOMparser (я знаю и про SAXParser, конечно) как это привычно для меня в PHP.
У Приватбанка (Украина) имеется API, с которым можно ознакомиться здесь. После изучения его становится ясно, что сервис достаточно информативный и было бы удобно иметь на мобильном устройстве средство общения с ним. Посмотрим как можно опросить этот сервис и получить такую избитую, но иногда полезную информацию как актуальный курс валют. После прочтения топика, в принципе, не составит труда написать и другие полезные функции.
Сервис работает предсказуемым образом. Вы формируете запрос:
privat24.privatbank.ua/p24/accountorder?oper=prp&PUREXML&apicour&country=ru
и в ответ получаете XML-ответ вида:
Здесь нас интересуют узлы exchangerate с атрибутом buy (сервис отдает значения курса покупки в копейках).
Для работы я сделал интерфейс проще не придумаешь (TextView+кнопка):

И для кнопки написал следующий код:
На мой взгляд — довольно просто. Еще раз напоминаю, что это тестовое приложение, которое, искренне надеюсь, окажется полезным для кого-нибудь.
Спасибо за внимание;)
Сразу хочу сказать, что, хотя тема не «Hello world», но рассматриваемая задача довольно проста и приведена здесь на Хабре скорее в качестве средства экономии времени для разработчиков, которым, возможно, надо будет поработать с XML-ответами от web-сервисов. Для XML-разбора я использовал DOMparser (я знаю и про SAXParser, конечно) как это привычно для меня в PHP.
У Приватбанка (Украина) имеется API, с которым можно ознакомиться здесь. После изучения его становится ясно, что сервис достаточно информативный и было бы удобно иметь на мобильном устройстве средство общения с ним. Посмотрим как можно опросить этот сервис и получить такую избитую, но иногда полезную информацию как актуальный курс валют. После прочтения топика, в принципе, не составит труда написать и другие полезные функции.
Сервис работает предсказуемым образом. Вы формируете запрос:
privat24.privatbank.ua/p24/accountorder?oper=prp&PUREXML&apicour&country=ru
и в ответ получаете XML-ответ вида:
<account_order> <support/> <version buildNum="2042" buildDate="Thu Nov 29 10:40:45 EET 2007"/> <logged sessioncount="1073" visitscount="298"/> <locale language="ru"> <date id="20090807T17:21:59" traditional="07.08.2009">07 авг 2009,Пт 17:21:59</date> </locale> <request url_base="https://privat24.privatbank.ua/p24/" url="/accountorder" os="Win" win="Y" ie="N"/> <info> <role id="2"/> <dump exchange="" oper="prp" PUREXML="" apicour="" country="ru" /> </info> <exchangerate> <exchangerate ccy="EUR" ccy_name_ru="Евро" ccy_name_ua="Євро " ccy_name_en="Euro" base_ccy="RU" buy="450476" unit="1" date="2009-08-26 00:00:00.0"/> <exchangerate ccy="USD" ccy_name_ru="Доллар США" ccy_name_ua="Долар США" ccy_name_en="US Dollar" base_ccy="RU" buy="315437" unit="1" date="2009-08-26 00:00:00.0"/> <exchangerate> </account_order>
Здесь нас интересуют узлы exchangerate с атрибутом buy (сервис отдает значения курса покупки в копейках).
Для работы я сделал интерфейс проще не придумаешь (TextView+кнопка):

И для кнопки написал следующий код:
public void getCurrencyClick(View v){ TextView tv = (TextView) findViewById(R.id.CurrencyTextView); try{ /* определяем URL сервиса готовим API, позволяющий выполнять разбор документа загружаем в парсер полученный ответ и вызываем метод parse */ URL url = new URL("https://privat24.privatbank.ua/p24/accountorder?oper=prp&PUREXML&apicour&country=ua"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new InputSource(url.openStream())); doc.getDocumentElement().normalize(); /*получаем агрегатный узел с дочерними узлами с атрибутами, хранящими значения валют; в ответе всего два узла, мы возьмем первый, а при необходимости тут вполне можно запустить цикл с nodeList.getLength */ NodeList nodeList = doc.getElementsByTagName("exchangerate"); Node node = nodeList.item(0); // опускаемся на узел ниже и получаем список его атрибутов NamedNodeMap attributes = node.getFirstChild().getAttributes(); //получаем значение атрибут buy Node currencyAttribEUR = attributes.getNamedItem("buy"); // ... и его значение String currencyValueEUR = currencyAttribEUR.getNodeValue(); // аналогично поступаем с датой, чтобы иметь представление о актуальности Node dateCurrency = attributes.getNamedItem("date"); String dateCurrencyStr = dateCurrency.getNodeValue(); // и выводим информацию tv.setText("Курс евро на "+dateCurrencyStr+":"+currencyValueEUR+ "коп"); } catch (Exception e) { tv.setText("Не удалось выполнить операцию"); }; }
На мой взгляд — довольно просто. Еще раз напоминаю, что это тестовое приложение, которое, искренне надеюсь, окажется полезным для кого-нибудь.
Спасибо за внимание;)
