Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 7361 / 1131 | Длительность: 09:49:00
Авторские права: Creative Commons Attribution 3.0
Самостоятельная работа 12:

Использование Веб-служб

< Самостоятельная работа 1 || Самостоятельная работа 12: 123

26.4. Интерфейсы прикладного программирования (API – Application Programming Interface)

Протокол передачи гипертекста HTTP делает возможным обмен данными между приложениями, а язык XML дает способ представления сложных данных, пересылаемых приложениями. Следующим шагом является определение и документирование "контрактов", заключаемых между приложениями. Общее название для подобных контрактов – Интерфейсы прикладного программирования (Application Programming Interfaces), или просто API.

Когда мы используем API, то в общем случае одна программа предоставляет набор сервисов, доступных другим программам для использования, и публикует API (т.е. правила), которые нужно соблюдать, чтобы воспользоваться этими сервисами. Подход, когда мы разрабатываем программы, функционирование которых включает доступ к сервисам, предоставляемым другими программами, называется Сервисно-ориентированной архитектурой (Service-Oriented Architecture) или SOA.

При использовании SOA приложение при своей работе пользуется сервисами других приложений. Без использования SOA приложение представляет собой отдельную (stand-alone) программу, содержащую внутри себя весь код, который необходим для ее работы. Мы встречаем множество примеров SOA, когда используем сеть. Можно войти на единый веб-сайт и заказать там авиабилеты, забронировать отель и арендовать автомобиль. Данные по отелям не хранятся на компьютерах, отвечающих за авиаперевозки. Вместо этого компьютеры авиалиний связываются с компьютерами отелей, получают от них необходимые данные и представляют их пользователю. Если пользователь согласен сделать заказ отеля через сайт авиалиний, последний использует другой сетевой сервис, предоставляемый системой, отвечающей за отели, чтобы выполнить реальный заказ отеля. И в тот момент, когда с вашей кредитной карты снимаются деньги за всю транзакцию целиком, другие компьютеры также вовлечены в этот процесс.


Сервис-ориентированная архитектура имеет множество преимуществ, включая следующие: (1) мы всегда храним лишь одну копию данных – это особенно важно при совершении таких действий, как бронирование отеля, когда важно не сделать заказ дважды; (2) собственники данных могут установить правила их использования. При этом SOA-системы должны быть тщательно разработаны, чтобы обеспечивать хорошую производительность и удовлетворять потребностям пользователей.

Когда приложение предоставляет через сеть набор услуг согласно своему API, мы называем это веб-службой.

26.5. Веб-службы Твиттера

Возможно, вы знакомы с сайтом Twitter и его приложениями http://www.twitter.com.

У Твиттера есть уникальный подход к его API/веб-службам, в которых все данные доступны приложениям, не относящимся к Твиттеру, с помощью Твиттер-API.

Так как Твиттер очень либерален в отношении доступа к своим данным, он позволил тысячам разработчиков программного обеспечения создавать собственные приложения, основанные на программном обеспечении Твиттера. Эти дополнительные приложения увеличивают значение Твиттера, делая его намного большим, чем просто веб-сайт. Веб-службы Твиттера позволяют создавать новые приложения, о которых команда Твиттера даже и не задумывалась. По статистике, более 90 процентов обращений к Твиттеру происходит через API (т.е. не через веб-интерфейс сайта ). Документацию API Твиттера можно просмотреть по ссылке: http://apiwiki.twitter.com/.

API Твиттера является примером типа REST-стиля1REST – сокращение от Representational State Transfer – стиль построения сетевых систем данных, при которых данные, представляющие текущее состояние некоторого ресурса, передаются от сервера клиентам по их запросам. – прим. перев. организации веб-служб. Например, используем Твиттер-API для извлечения списка пользователей-друзей и их статусов. Чтобы посмотреть список друзей пользователя drchuck, перейдем по ссылке http://api.twitter.com/1/statuses/friends/drchuck.xml

Не всякий браузер корректно отображает XML. Однако всегда можно увидеть возвращаемый Твиттером XML-текст, посмотрев исходный код полученной "веб-страницы".

Получить этот XML-код можно и с помощью Питона, используя библиотеку urllib:

import urllib
TWITTER_URL = 'http://api.twitter.com/l/statuses/friends/ACCT.xml'
while True:
print ''
acct = raw_input('Enter Twitter Account:')
if ( len(acct) < 1 ) : break
url = TWITTER_URL.replace('ACCT', acct)
print 'Retrieving', url
document = urllib.urlopen (url).read()
print document[:250]
  

Программа запрашивает название учетной записи Твиттера и, используя Твиттер-API, открывает URL, содержащую список друзей и их статус, получает текст URL и печатает первые 250 символов текста.

python twitter1.py

Enter Twitter Account:drchuck
Retrieving http://api.twitter.com/l/statuses/friends/drchuck.xml
<?xml version="1.0" encoding="UTF-8"?>
<users type="array">
<user>
<id>115636613</id>
<name>Steve Coppin</name>
<screen_name>steve_coppin</screen_name>
<location>Kent, UK</location>
<description>Software developing, best practicing, agile e
Enter Twitter Account:
  

В этом приложении мы получаем из сети XML-код точно так же, как и HTML-страницу. Если необходимо извлечь данные из XML, можно было бы использовать строковые функции Питона, но это непросто, поскольку требует погружения в детали XML.

Извлеченный XML-код может выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<users type="array">
<user>
<id>115636613</id>
<name>Steve Coppin</name>
<screen_name>steve_coppin</screen_name>
<location>Kent, UK</location>
<status>
<id>10174607039</id>
<source>web</source>
</status>
</user>
<user>
<id>17428929</id>
<name>davidkocher</name>
<screen_name>davidkocher</screen_name>
<location>Bern</location>
<status>
<id>10306231257</id>
<text>@MikeGrace If possible please post a detailed bug report </text>
</status>
</user>
...
  

Верхний тег – "users", он включает в себя несколько тегов "user", которые являются его потомками. Тег "status", в свою очередь, является потомком каждого тега "user".

26.6. Обработка XML-данных, полученных с помощью API

После получения правильно структурированных XML-данных с помощью API мы обычно используем XML-парсер, такой, как ElementTree, для извлечения информации из XML. В приведенной ниже программе мы получаем список друзей и их статусы, пользуясь API Твиттера, и затем разбираем возвращенный XML-код, чтобы напечатать первых четырех друзей и их статус.

import urllib
import xml.etree.ElementTree as ET
TWITTER_URL = 'http://api.twitter.com/l/statuses/friends/ACCT.xml'
while True:
print ''
acct = raw_input('Enter Twitter Account:')
if ( len(acct) < 1 ) : break
url = TWITTER_URL.replace('ACCT', acct)
print 'Retrieving', url
document = urllib.urlopen (url).read()
print 'Retrieved', len(document), 'characters.'
tree = ET.fromstring(document)
count = 0
for user in tree.findall('user'):
count = count + 1
if count > 4 : break
print user.find('screen_name').text
status = user.find('status')
if status :
txt = status.find('text').text
print ' ',txt[:50]
    

С помощью метода findall мы получаем список узлов с тегом user и затем перебираем элементы списка в цикле for. Для каждого узла user мы извлекаем и печатаем текст сыновнего узла screen_name и затем извлекаем сыновний узел status. Если последний существует, то мы печатаем первые 50 символов содержащегося в нем текста.

Идея программы проста и понятна, мы используем методы findall и find для извлечения либо списка узлов, либо одного узла и затем в случае, когда узел представляет сложный элемент с множеством подчиненных узлов, мы погружаемся глубже по дереву до тех пор, пока не находим интересующий нас текстовый элемент.

Выполнив программу, получим:

python twitter2.py
Enter Twitter Account:drchuck
Retrieving http://api.twitter.com/l/statuses/friends/drchuck.xml

Retrieved 193310 characters.
steve_coppin
Looking forward to some "oh no the markets closed,
davidkocher
@MikeGrace If possible please post a detailed bug
hrheingold
From today's Columbia Journalism Review, on crap d
huge_idea
@drchuck #cnx2010 misses you, too. Thanks for co
Enter Twitter Account:hrheingold
Retrieving http://api.twitter.com/l/statuses/friends/hrheingold.xml
Retrieved 208081 characters.
carr2n
RT @tysone: Saturday's proclaimation by @carr2n pr
tiffanyshlain
RT @ScottKirsner: Turning smartphones into a tool
soniasimone
@ACCompanyC Funny, smart, cute, and also nice! He
JenStone7617
Watching "Changing The Equation: High Tech Answers
Enter Twitter Account:
    

Код для разбора XML и извлечения нужных полей с помощью библиотеки ElementTree составляет всего несколько строк, это намного проще, чем использование строковых методов Питона для решения аналогичной задачи.

< Самостоятельная работа 1 || Самостоятельная работа 12: 123
Алексей Виноградов
Алексей Виноградов

Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе.

Петр Олейников
Петр Олейников

Данные файлы неоходимы не только для самостоятельных работ, но и для тестов. А по ссылкам в лекциях они не доступны, выдает ошибку 404.