0% нашли этот документ полезным (0 голосов)
24 просмотров

Pythonlearn 13 WebServices

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

Загружено:

mseytkazieva
Авторское право
© © All Rights Reserved
Доступные форматы
Скачать в формате PPTX, PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
24 просмотров

Pythonlearn 13 WebServices

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

Загружено:

mseytkazieva
Авторское право
© © All Rights Reserved
Доступные форматы
Скачать в формате PPTX, PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 55

Использование веб-сервисов

Глава 13

Пайтон для всех


www.py4e.com
Данные в Веб
• Так как технология HTTP (запрос/ответ) понятна и хорошо
поддерживается, возник естественный переход к обмену
данными между программами, использующими эти протоколы

• Необходимо было придумать согласованный способ


представления данных, передаваемых между приложениями
и по сети

• Обычно используются два формата: XML и JSON


Передача данных по «сети»
PHP JavaScript
массив {
Объект
"имя" : "Чак",
"телефон" : "303-4456"
}
Пайтон Java
Словарь Хешмап

Также известный как «Проводной протокол передачи данных» — то,


что мы отправляем по сети («по проводам»)
Соглашения по формату передачи

<person>
<name> Десериализовать
Chuck
Пайтон </name> Java
Словарь <phone> Хешмап
Сериализовать
303 4456
</phone>
</person>
XML
Соглашения по формату передачи

Десериализовать
{
Пайтон "имя" : "Чак", Java
"телефон" : "303-4456"
Словарь }
Хешмап
Сериализовать

JSON
XML
Разметка данных для отправки по сети…

https://ru.wikipedia.org/wiki/XML
XML-элементы (Ноды)
<people>
<person>
<name>Чак</name>
<phone>303 4456</phone>
• Простой элемент </person>
<person>
• Сложный элемент
<name>Ноа</name>
<phone>622 7421</phone>
</person>
</people>
Расширяемый язык разметки (XML)
• Основная цель — помочь информационным системам
обмениваться структурированными данными

• Появился как подмножество Стандартного обобщенного


языка разметки (англ. SGML) и разработан так, чтобы быть
понятным человеку

https://ru.wikipedia.org/wiki/XML
Основы XML
• Начальный тег <person>
<name>Чак</name>
• Закрывающий тег
<phone type="intl">
• Текстовый контент +1 734 303 4456
</phone>
• Атрибут
<email hide="yes" />
• Самозакрывающийся тег </person>
Пробелы
<person>
Концы строк не имеют значения.
<name>Чак</name>
<phone type="intl"> Пробелы в текстовых элементах
+1 734 303 4456 обычно отбрасываются.
</phone> Мы делаем отступ только для
<email hide="yes" /> удобства чтения
</person>
<person>
<name>Чак</name>
<phone type="intl">+1 734 303 4456</phone>
<email hide="yes" />
</person>
XML-терминология
• Теги обозначают начало и конец элемента
• Атрибуты — Пары Ключевое слово/Значение в открывающем
теге XML
• Сериализовать / Десериализовать — преобразовать данные
программы в общий формат, который может храниться и/или
передаваться между системами независимо от языка
программирования
https://ru.wikipedia.org/wiki/Сериализация
XML в виде дерева
a
<a>
<b>X</b>
<c>
b c
<d>Y</d>
<e>Z</e>
</c> X d e
</a>

Элементы Текст Y Z
Текст и атрибуты в XML
a
<a>
<b w="5">X</b>
<c> w-
b Текстовая
c
<d>Y</d> атрибут нода
<e>Z</e>
</c> 5 X d e
</a>

Элементы Текст Y Z
XML в виде путей a
<a>
<b>X</b>
b c
<c> /a/b X
<d>Y</d> /a/c/d Y
<e>Z</e> /a/c/e Z X d e
</c>
</a>
Y Z
Элементы Текст
XML-схема
Описание правил, которым должен подчиняться документ

http://en.wikipedia.org/wiki/Xml_schema
http://en.wikibooks.org/wiki/XML_Schema
XML-схема
• Язык описания структуры XML-документа

• Налагает ограничения на структуру и содержимое документа

• Часто используется для установления «контракта» между системами:


«Моя система будет принимать XML, который соответствует этой
конкретной Схеме»

• Если конкретный фрагмент XML соответствует спецификации Схемы, он


считается «подтвержденным»

http://en.wikipedia.org/wiki/Xml_schema
Валидация XML

XML-документ

Валидатор
Договор об
XML-схеме
XML-документ Валидация XML
<person>
<lastname>Severance</lastname>
<age>17</age>
<dateborn>2001-04-17</dateborn>
</person>

Договор об XML-схеме
<xs:complexType name=”person”>
Валидатор
<xs:sequence>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
</xs:sequence>
</xs:complexType>
Множество языков XML-схемы
• Определение типа документа (англ. DTD)

- https://ru.wikipedia.org/wiki/DTD

• Стандартный обобщенный язык разметки (ISO 8879:1986 SGML)

- https://ru.wikipedia.org/wiki/SGML

• XML-схема (W3C) - ( .XSD - расширение файла)

- https://ru.wikipedia.org/wiki/XML_Schema_(W3C)
http://en.wikipedia.org/wiki/Xml_schema
XSD XML-схема (W3C)
• Мы сосредоточимся на версии Консорциума Всемирной паутины
(англ.W3C)

• Ее часто называют «W3C-схема», так как «Схема» считается


универсальной

• Частенько ее называют XSD, так как файл имеет расширение .xsd


http://www.w3.org/XML/Schema
https://ru.wikipedia.org/wiki/XML_Schema_(W3C)
Структура XSD <person>
<lastname>Severance</lastname>
<age>17</age>
<dateborn>2001-04-17</dateborn>
</person>
• xs:element
<xs:complexType name=”person”>
• xs:sequence <xs:sequence>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
• xs:complexType <xs:element name="dateborn" type="xs:date"/>
</xs:sequence>
</xs:complexType>
<xs:element name="person">
<xs:complexType> XSD-ограничения
<xs:sequence>
<xs:element name="full_name" type="xs:string"
minOccurs="1" maxOccurs="1" />
<xs:element name="child_name" type="xs:string"
minOccurs="0" maxOccurs="10" />
</xs:sequence>
</xs:complexType> <person>
</xs:element> <full_name>Tove Refsnes</full_name>
<child_name>Hege</child_name>
<child_name>Stale</child_name>
<child_name>Jim</child_name>
<child_name>Borge</child_name>
</person>

http://www.w3schools.com/Schema/schema_complex_indicators.asp
<xs:element name="customer" type="xs:string"/>
Типы данных
<xs:element name="start" type="xs:date"/>
<xs:element name="startdate" type="xs:dateTime"/>
XSD
<xs:element name="prize" type="xs:decimal"/>
<xs:element name="weeks" type="xs:integer"/>

<customer>John Smith</customer>
Время обычно отображается
<start>2002-09-24</start>
в формате UTC/GMT,
учитывая, что серверы часто <startdate>2002-05-30T09:30:10Z</startdate>
разбросаны по всему миру <prize>999.50</prize>
<weeks>30</weeks>

http://www.w3schools.com/Schema/schema_dtypes_numeric.asp
ISO 8601 Формат Дата/Время
2002-05-30T09:30:10Z

Год-месяц-день Часовой пояс обычно


Время
указывается в формате
UTC / GMT, а не в формате
местного часового пояса
https://ru.wikipedia.org/wiki/ISO_8601
https://ru.wikipedia.org/wiki/Всемирное_координированное_время
http://www.w3schools.com/Schema/schema_example.asp
xml1.py
import xml.etree.ElementTree as ET
data = '''<person>
<name>Chuck</name>
<phone type="intl">
+1 734 303 4456
</phone>
<email hide="yes"/>
</person>'''

tree = ET.fromstring(data)
print('Name:',tree.find('name').text)
print('Attr:',tree.find('email').get('hide'))
import xml.etree.ElementTree as ET
xml2.py
input = '''<stuff>
<users>
<user x="2">
<id>001</id>
<name>Chuck</name>
</user>
<user x="7">
<id>009</id>
<name>Brent</name>
</user>
</users>
</stuff>'''

stuff = ET.fromstring(input)
lst = stuff.findall('users/user')
print('User count:', len(lst))
for item in lst:
print('Name', item.find('name').text)
print('Id', item.find('id').text)
print('Attribute', item.get("x"))
Текстовый формат обмена
данными (JSON)
Литеральная нотация объектов в JavaScript

• Формат JSON был разработан


Дугласом Крокфордом
• Литеральная нотация объектов
в JavaScript

http://www.youtube.com/watch?v=kc8BAR7SHJI
import json json1.py
data = '''{
"name" : "Chuck",
"phone" : {
"type" : "intl",
"number" : "+1 734 303 4456"
}, Формат JSON
"email" : { представляет данные в
"hide" : "yes" виде вложенных
} «списков» и «словарей»
}'''

info = json.loads(data)
print('Name:',info["name"])
print('Hide:',info["email"]["hide"])
import json json2.py
input = '''[
{ "id" : "001",
"x" : "2",
"name" : "Chuck"
},
{ "id" : "009",
"x" : "7", Формат JSON
"name" : "Chuck"
} представляет данные в
]''' виде вложенных
«списков» и «словарей»
info = json.loads(input)
print('User count:', len(info))
for item in info:
print('Name', item['name'])
print('Id', item['id'])
print('Attribute', item['x'])
Сервис-ориентированный
подход

https://ru.wikipedia.org/wiki/Сервис-ориентированная_архитектура
Сервис-ориентированный подход
• Большинство веб-приложений используют сервисы
Приложение

• Используются сервисы из других приложений:


APIs
- Комиссия по кредитной карте;

- Системы бронирования отелей.

• Сервисы публикуют «правила», которым


приложения должны следовать, чтобы Сервис
Сервис
использовать данный сервис (API)
Многочисленные системы
• Изначально две системы
взаимодействуют и разделяют
проблему между собой

• По мере того как данные/сервис


становятся полезными, многие
приложения хотят использовать
информацию / приложение

http://www.youtube.com/watch?v=mj-kCFzF0ME 5:15
Веб-сервисы

https://ru.wikipedia.org/wiki/Веб-служба
Программный интерфейс приложения (API)
API определяет интерфейс и поведение объектов в этом
интерфейсе, но при этом позволяет абстрагироваться от того,
как именно эта функциональность будет реализована.
Программное обеспечение, которое предоставляет
функциональность, описываемую в API, называется
«реализация» API. Обычно API определяется в терминах языка
программирования, используемого при создании приложения

https://ru.wikipedia.org/wiki/API
https://developers.google.com/maps/documentation/geocoding/
{
"status": "OK",
"results": [
{
"geometry": {
"location_type": "APPROXIMATE",
"location": {
"lat": 42.2808256,
"lng": -83.7430378 http://maps.googleapis.com/maps/api/geocode/json?
} address=Ann+Arbor%2C+MI
},
"address_components": [
{
"long_name": "Ann Arbor",
"types": [
"locality",
"political"
],
"short_name": "Ann Arbor"
}
],
"formatted_address": "Ann Arbor, MI, USA",
"types": [
"locality",
"political"
] geojson.py
}
]
}
import urllib.request, urllib.parse, urllib.error
import json

serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'

while True:
address = input('Введите местонахождение: ')
if len(address) < 1: break

url = serviceurl + urllib.parse.urlencode({'address': address})

print('Извлечение с ', url) Введите местонахождение: Ann Arbor, MI


uh = urllib.request.urlopen(url)
data = uh.read().decode() Извлечение с http://maps.googleapis.com/...
print('Извлечено', len(data), 'символов') Извлечено 1669 символов
try: Широта 42.2808256 Долгота -83.7430378
js = json.loads(data) Ann Arbor, MI, USA
except:
js = None Введите местонахождение:

if not js or 'status' not in js or js['status'] != 'OK':


print('==== Ошибка извлечения ====')
print(data)
continue

lat = js["results"][0]["geometry"]["location"]["lat"]
lng = js["results"][0]["geometry"]["location"]["lng"] geojson.py
print('Широта', lat, 'Долгота', lng)
location = js['results'][0]['formatted_address']
print(location)
API-безопасность и ограничение на
количество обращений
• Вычислительные ресурсы для запуска этих API являются
платными

• Обычно данные, предоставляемые этими API, имеют ценность

• Поставщики данных могут ограничивать количество запросов в


день, запрашивать API-ключ, а также взимать плату за
использование

• Время от времени правила могут меняться


Ограничения по использованию

2,500 запросов в день

Не более 100,000 запросов в день для бизнес-клиентов


import urllib.request, urllib.parse, urllib.error
import twurl
import json twitter2.py
TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json'

while True:
print('')
acct = input('Enter Twitter Account:')
if (len(acct) < 1): break
url = twurl.augment(TWITTER_URL,
{'screen_name': acct, 'count': '5'})
print('Retrieving', url)
connection = urllib.request.urlopen(url)
data = connection.read().decode()
headers = dict(connection.getheaders())
print('Remaining', headers['x-rate-limit-remaining'])
js = json.loads(data)
print(json.dumps(js, indent=4))

for u in js['users']:
print(u['screen_name'])
s = u['status']['text']
print(' ', s[:50])
Enter Twitter Account:drchuck
Retrieving https://api.twitter.com/1.1/friends ...
Remaining 14 twitter2.py
{
"users": [
{
"status": {
"text": "@jazzychad I just bought one .__.",
"created_at": "Fri Sep 20 08:36:34 +0000 2013",
},
"location": "San Francisco, California",
"screen_name": "leahculver",
"name": "Leah Culver",
},
{
"status": {
"text": "RT @WSJ: Big employers like Google ...",
"created_at": "Sat Sep 28 19:36:37 +0000 2013",
},
"location": "Victoria Canada",
"screen_name": "_valeriei",
"name": "Valerie Irvine",
],
}
Leahculver
@jazzychad I just bought one .__._
Valeriei
RT @WSJ: Big employers like Google, AT&amp;T are h
Ericbollens
RT @lukew: sneak peek: my LONG take on the good &a
halherzog
Learning Objects is 10. We had a cake with the LO,
def oauth() : hidden.py
return { "consumer_key" : "h7Lu...Ng",
"consumer_secret" : "dNKenAC3New...mmn7Q",
"token_key" : "10185562-ein2...P4GEQQOSGI",
"token_secret" : "H0ycCFemmwyf1...qoIpBo" }
import urllib
import oauth
twurl.py
import hidden

def augment(url, parameters) :


secrets = hidden.oauth()
consumer = oauth.OAuthConsumer(secrets['consumer_key'], secrets['consumer_secret'])
token = oauth.OAuthToken(secrets['token_key'],secrets['token_secret'])
oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer,
token=token, http_method='GET', http_url=url, parameters=parameters)
oauth_request.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(), consumer, token)
return oauth_request.to_url()

https://api.twitter.com/1.1/statuses/user_timeline.json?
count=2&oauth_version=1.0&oauth_token=101...SGI&screen_name=drchuck&oauth_nonce=
09239679&oauth_timestamp=1380395644&oauth_signature=rLK...BoD&oauth_consumer_ke
y=h7Lu...GNg&oauth_signature_method=HMAC-SHA1
Резюме
• Сервис-ориентированная архитектура позволяет разбить приложение на
независимые компоненты и использовать их в сети

• Программный интерфейс приложения (API) — договор для взаимодействия

• Веб-сервисы предоставляют инфраструктуру для приложений, взаимодейст-


вующих (API) по сети: SOAP и REST — два стиля взаимодействия веб-
сервисов

• XML и JSON — форматы сериализации (публикации по частям)


Авторы / Благодарности
… Insert new Contributors and Translations here
...
Авторские права на эти слайды принадлежат Чарльзу Р.
Северансу (www.dr-chuck.com) , 2010 г., Школе Информации
Мичиганского Университета и open.umich.edu , и доступны по
лицензии Creative Commons Attribution 4.0 License.
Пожалуйста, сохраняйте этот слайд во всех копиях этого
документа, в соответствии с требованиями Лицензии. Если
вы внесли изменения, добавьте свое имя или организацию в
список участников на этой странице.

Исходная разработка: Чарльз Северанс, Школа


Информации Мичиганского Университета.

Перевод выполнила Фомкина Виолетта.

… Добавьте сюда новых авторов и переводчиков

Вам также может понравиться