Пишем клиента для OData на Python
Опубликовано: 27 июня, 2010 | Автор: butaji | Filed under: .net, oData, Python | Tags: Metaprogramming, Netflix, oData, Python | Оставьте комментарийOpen Data Protocol
Что это такое и для чего создан очень хорошо рассказано в этом видео: http://www.msteched.com/2010/NorthAmerica/DEV208
Python
Одним из аргументов в пользу OData звучит то, что данный протокол не зависит от платформы, и это очевидно (AtomPub), а так же не привязан к конкретному вендору. Но всё же я решил набросать небольшой пример, в котором эмулировать привычный .NET API для работы с OData
Lets code it
import odata url = "http://odata.netflix.com/Catalog/" service = odata.service(url) service.Languages languages = service.execute() print languages
Давайте разбираться, что же написано выше.
http://odata.netflix.com/Catalog/ - netflix является одним из официальных поставщиков OData
Итак, мы импортируем наш модуль OData, который мы реализуем чуть позже, далее создаем сервис, для получения данных и читаем какие языки будет предоставлять нам netflix.
odata.py
import urllib2 import feedparser version = '0.1'
feedparser — не входит в набор стандартных библиотек python, поэтому её надо будет скачать и установить, как видно из нахвания библиотека предоставляет гибкий API для доступа к различным лентам данных, а следовательно отлично подходит для нашей будущей реализации
class service(interceptor): def __init__(self, url): self.url = url
Реализация класса service (фактически data-proxy), который будет основной точкой доступа для работы с данными.
Очевидно, что для запроса Languages, это свойство должно присутствовать в нашей реализации, но так же не менее очевидно, что каждая реализация OData ленты может предоставлять свои собственные данные, в связи с этим мы реализуем некоторый механизм формирования запросов на основе полученных от пользователя вызовах.
Внимательный читатель мог заметить, что service наследует от некоторого класса interceptor, вот он:
class interceptor(object): def __getattribute__(self, name): try: return object.__getattribute__(self, name) except: self.property = name
Из реализации видно, что наш класс занимается тем, что отлавливает вызов несуществующих свойств, к примеру наш Languages и записывает последний в поле property.
Следующей итерацией необходимо имплементировать вызов метода получения данных execute()
class service(interceptor): def __init__(self, url): self.url = url def execute(self): proc_url = self.url + "/" + self.property result = feedparser.parse(proc_url) for entry in result.entries: print entry.title
В данном методе мы формируем url-строку для запроса ленты данных, в последствии пробегаемся по результату и выводим значения клиенту.
Это лишь начальная стадия реализации, многие вопросы не учтены (фильтрация данных, построение запросов и прочее), однако данный пример наглядно указывает на общеупотребимость Open Data Protocol в повседневных нуждах разработки.
Что почитать
Adventures in Meta programming in Python: im_class, __import__, __getattribute__ http://www.lostechies.com/blogs/rssvihla/archive/2010/01/08/adventures-in-meta-programming-in-python-im-class-import-getattribute.aspx
Introducing a Ruby OData Client Library http://blogs.visoftinc.com/archive/2010/06/12/Introducing-a-Ruby-OData-Client-Library.aspx
LINQPad теперь тоже понимает OData http://www.linqpad.net/Beta.aspx
Создание OData API для StackOverflow включая XML и JSON за 30 минут http://blog.zzlab.ru/perevod/sozdanie-odata-api-dlya-stackoverflow-vklyuchaya-xml-i-json-za-30-minut.html
Что такое API данных Google? http://code.google.com/intl/ru-RU/apis/gdata/