Pythonlearn 13 WebServices
Pythonlearn 13 WebServices
Глава 13
<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)
• Основная цель — помочь информационным системам
обмениваться структурированными данными
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-документа
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
- https://ru.wikipedia.org/wiki/SGML
- https://ru.wikipedia.org/wiki/XML_Schema_(W3C)
http://en.wikipedia.org/wiki/Xml_schema
XSD XML-схема (W3C)
• Мы сосредоточимся на версии Консорциума Всемирной паутины
(англ.W3C)
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
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
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/Сервис-ориентированная_архитектура
Сервис-ориентированный подход
• Большинство веб-приложений используют сервисы
Приложение
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
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 являются
платными
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&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
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
Резюме
• Сервис-ориентированная архитектура позволяет разбить приложение на
независимые компоненты и использовать их в сети