
XML-RPC (XML Remote Procedure Call) является протоколом удаленного вызова процедур, который использует XML для кодирования запросов и ответов. Он позволяет исполнять удаленные процедуры на удаленных серверах по протоколу HTTP. Язык программирования Python предоставляет библиотеки и инструменты для работы с протоколом XML-RPC.
Для работы с XML-RPC на языке Python необходимо импортировать модуль xmlrpc.client. Этот модуль предоставляет классы и функции для создания XML-RPC клиентов и серверов.
Для создания клиента XML-RPC на языке Python необходимо сначала создать объект класса ServerProxy, указав URL-адрес XML-RPC сервера. Затем, можно вызывать удаленные процедуры на сервере с помощью методов этого объекта.
Вот пример простого клиента XML-RPC на языке Python⁚
«`python
import xmlrpc.client
# Создание объекта клиента
client = xmlrpc.client.ServerProxy('http⁚//example.com/xmlrpc')
# Вызов удаленной процедуры
result = client.add(2٫ 3)
«`
В данном примере, мы создаем клиентский объект, указывая URL-адрес XML-RPC сервера. Затем, мы вызываем удаленную процедуру "add" с аргументами 2 и 3 и сохраняем результат в переменной "result". В данном случае, удаленная процедура складывает два числа и возвращает их сумму. Мы выводим результат на экран.
Кроме вызова удаленных процедур, можно использовать клиентский объект для получения доступа к удаленным данным, выполнять асинхронные вызовы процедур и работать с различными типами данных, такими как списки, словари и т.д.
Для создания XML-RPC сервера на языке Python также необходимо использовать модуль xmlrpc.server. Этот модуль предоставляет класс SimpleXMLRPCServer для создания серверов и декларирует функции и методы, которые могут быть удаленно вызваны.
Вот пример простого сервера XML-RPC на языке Python⁚
«`python
import xmlrpc.server
# Определение удаленной процедуры
def add(x, y)⁚
return x + y
# Создание сервера
server = xmlrpc.server.SimpleXMLRPCServer(('localhost', 8000))
# Регистрация удаленной процедуры
server.register_function(add, 'add')
# Запуск сервера
server.serve_forever
«`
В данном примере, мы определяем удаленную процедуру "add", которая принимает два аргумента и возвращает их сумму. Затем, мы создаем сервер, указывая хост и порт, на котором сервер будет слушать. После этого, мы регистрируем удаленную процедуру методом register_function, указывая имя удаленной процедуры и функцию, которую она должна вызывать. Затем мы запускаем сервер методом serve_forever, который будет работать в бесконечном цикле, ожидая вызовов удаленных процедур.
Это лишь основы работы с XML-RPC на языке Python. Однако, с помощью библиотеки xmlrpc.client и xmlrpc.server можно создать мощные и гибкие системы клиент-серверного взаимодействия на основе XML-RPC протокола.
В не столь далеком прошлом работа автоматизированных систем взаимосвязи приводила специалистов в отчаяние из-за сложности. Вездесущность Интернета и простота его протоколов открыли новые перспективы в этом вопросе. Сегодня нужно думать не о сложности задачи, а о том, какой инструмент выбрать.
Две наиболее популярные среды, Enterprise Javabeans и Microsoft Com, очень выразительны и мощны, но также очень сложны. Они привносят в процесс много дополнительной работы. Другие особенности, такие как возможность работы с различными платформами и разными языками, усложняют вопрос выбора между ними. В последнее время для решения многих из этих проблем нам стал известен простой протокол доступа (SOAP). SOAP имеет несколько незавершенных реализаций, которые уже используются, но все еще находятся в стадии разработки. Некоторые реализации пока не могут взаимодействовать друг с другом.
Что же делать разработчикам?
До сих пор разработчики просто использовали то, что было доступно сегодня и могло работать. А вот что работало хорошо, так это XML-RPC. Это просто, эффективно и последовательно. XML-RPC может взять на себя роль «клея» который « брат » — SOAP не может этого сделать. Если вы ищете большую среду для объединения автоматизированных служб и подобных разнородных серверов и функций, XML-RPC не для вас. XML-RPC — это быстрое, простое и мощное средство для распределенных систем, независимо от того, какой язык используют их части. XML-RPC — это гибридное решение. Он не является объективным в самом строгом смысле этого слова: это не гибридное решение. &.#171;RPC» « Remote Prudea Call » RPC очень прост & # 8212 — пользователь посылает запрос по сети и получает ответ. Если это звучит для вас подозрительно знакомо, — это потому, что Интернет привык к эксплуатации таких систем. RPC звонила в колокол в 1990-х годах. Его разработчики оказались неспособны стандартизировать структуры данных. Sun пыталась применить стандарты к XDR. Однако он так и не был применен в полной мере. Развитие объектного программирования поставило RPC в невыгодное положение. Когда к RPC был добавлен XML, процесс приобрел общую стандартную структуру представления данных, что придало RPC новый импульс. Но опять же — зачем его использовать?
Главная неоспоримая причина использования XML-RPC заключается в том, что он работает и работает очень хорошо. Программистам редко требуется устанавливать и использовать библиотеку Python XMLRPCLIB для взаимодействия с Python, PHP, Java, Perl, C ++ и даже COM. Целая глава, посвященная XML-RPC, в книге-бестселлере # 171; Java and XML » посвящена XML-RPC. В мире языка Python наиболее распространенный XML-RPC используется в Zope. Zope справляется с XML-RPC и поддерживает его с середины 1999 года.
Библиотека XMLRPCLIB от Pythonware
В отличие от других языков своего поколения, Python всегда умел создавать постоянные объекты. Объем этих возможностей постоянно расширяется за счет пакетов стандартной библиотеки (&.#171;marshall»), преобразование простых объектов для хранения на уровне файлов, « zope объектная база данных, » которая конкурирует с функциональностью коммерческой цели базы данных (OODB). Маршаллинг — это перевод объектов из их внутреннего представления в программе в независимую форму. В рамках XMLRPCLIB маршаллинг объекта Python означает перевод его в вызов XML-RPC. Удаление его из сепарации — это обратный процесс.
Библиотека XmlrpClib, написанная Фредериком Лэндом из Pythonware, скрывает всю сложность прямого и обратного маршалинга объектов. Точно так же скрыты детали соединения с сервером, отправки запросов и получения ответов.
Вы можете загрузить последнюю версию XMLRPClib.py (и более подробную информацию о библиотеке) со страницы Python XML-RPC.
XML-RPC и Meerkat
Рейл Дорнфест, основная движущая сила продвижения XML в PHP, создал довольно естественный XML-RPC интерфейс с Meerkat, сервисом открытого доступа, который использует RSS для сбора новостной информации из различных источников. Давайте воспользуемся этим готовым сервером. Первое, что мы сделаем, это представим раздел &.#171;красивой» Секция печати (pprint) из стандартной библиотеки Python. Некоторые шоу Meerkat очень большие, например.
>>> PPRINT Импорт из PPRINT
После ввода xmlrpclib используйте xmlrpclib для входа на сервер. Он состоит из одной строки.
> > > > meerkatsvr = xmlrpclib.server (" http: //www.oreillynet.com/meerkat/xml-rpc/server.php")
Здесь создан пример сервера XML-RPC, который может подключаться, отправлять и получать XML-RPC. Благодаря ретроспекции, этот сервер также может понимать приложения XML-RPC.
Теперь запросим список методов, доступных на сервере.
>>> pprint (meerkatsvr.system.listmethods()) ['meerkat.getchannels',. 'meerkat.getcategories',. 'meerkat.getChannelsBycategory',. 'meerkat.getitems',. 'System.listmethods',. 'System.Methodhelp',. 'System.MethodSignature']
Ответы были получены путем подключения к серверу в Интернете с помощью XML-RPC. Обратите внимание, что в дополнение к простоте этого подхода, формат результатов, возвращаемых xmlrpclib, является "родным". Список языков Python. Восстановление списка каналов из Meerkat
Meerkat группирует каналы по темам, называемым категориями. Например, XML-каналы относятся к категории 23. Если вы хотите получать список каналов по определенной теме, вы можете отправить следующий запрос в Meerkat.
>>> pprint (meerkatsvr.meerkat.getchannelsbycategory (23)) [<'title': '<XML>fr', 'id': 2991>, <'title': '4xt', 'id': 2559>, <'title': 'Eclectic', 'id': 555>, <'title': 'eXploringXML', 'id': 4471>, <'title': 'eXploringXML Channel', 'id': 1105>, <'title': 'finetuning com', 'id': 107>, <'title': 'finetuning.com', 'id': 4628>, <'title': 'Free XML tools', 'id': 906>, <'title': 'JabberCentral Recent Jabber News', 'id': 4655>, <'title': 'Moreover XML and metadata news', 'id': 2243>, <'title': 'moreover... XML and metadata news', 'id': 683>, <'title': 'My Userland', 'id': 1945>, <'title': "O'Reilly Network XML FAQs", 'id': 2365>, <'title': 'oreillynet.xml', 'id': 989>, <'title': 'oreillynet.xmldev', 'id': 990>, <'title': 'SOAP Webservices Resource Center', 'id': 2022>, <'title': 'XML About com', 'id': 2435>, <'title': 'XML News from PerlXML.com', 'id': 718>, <'title': 'XML XSL Portal', 'id': 4460>, <'title': 'XML.com', 'id': 47>, <'title': 'XML.com Resource Guide', 'id': 4637>, <'title': 'xmlhack', 'id': 724>, <'title': 'xmlTree Newsletter', 'id': 413>]
Углубляемся в XML-RPC и Meerkat
В своей статье о программировании клиентов Tissue (см. Перевод Intersoft Lab) я показал, как можно легко загрузить список всех статей Meerkat о Linux, используя мощную библиотеку Urlib в Python и очень простой сценарий Мы показали, как. Просмотрите это задание с помощью XMLRPCLIB. Его также можно использовать в более простых сценариях для создания более мощных приложений, устраняя некоторые неясности и погони предыдущего подхода.
Откройте новую интерактивную сессию Python, импортируйте XMLRPCLIB, создайте серверный случай и свяжитесь с сервером MeerKat.
>>> Импорт xmlrpclib >>> meerkaturi = http://www.oreillynet.com/meerkat/xml-rpc/server.php) >>> meerkatsvr = xmlrpclib.server (meerkaturi)
Перед тем как приступить к кодированию обновленного решения, давайте рассмотрим некоторые функции, встроенные в XML-RPC-сервер Rail Dornfest Meerkat, и поразмышляем над его функциональностью. Мы уже рассмотрели system.listmethods (). Он возвращает серверу текущий список доступных методов. Вы можете получить сигнатуру метода для любого из этих методов, вызвав Methodsignature ().
>>> meerkatsvr.system.methodsignature (methodname)
Эта строка возвращает таблицу из двух элементов, содержащую возвращаемое значение и параметры указанного метода. Обратите внимание, что закрывающая скобка не должна быть включена после имени метода.
Дорнфест также предоставил средства для получения помощи по серверным методам.
>>> meerkatsvr.system.methodhelp (meerkat.getitems)
Чтобы увидеть этот другой метод, доступный клиентам Meerkat XML-RPC, пожалуйста, посетите интерфейс Meerkat XML-RPC. Из выпадающего списка, выбрав 'introspection', вы можете увидеть все методы, доступные в документе. Если URI доступен, сервер Meerkat XML-RPC также проверит его и вернет как метод, так и ответ сервера. Хорошо.
Загрузить список статей по Linux из Meerkat
Как вы, возможно, помните, отправка программы на мою статью о программировании веб-клиентов заключалась в получении ссылки на статьи о Linux на Meerkat за последний час. После создания периметра доступа к серверу с помощью Urlib, я создал URI
http://www.oreillynet.com/meerkat/?p=5&?t=1or & gerdl = минимальный & ghuste = 0 & = _ca = 0 & = _ ch = 0 & _da = 0.
Представьте, что вышеуказанные строки доступны в вашем приложении! Инструмент URI Update инструктирует Meerkat предоставить все текстовые блоки из категорий Linux, записанные за последний час, используя минимальную конфигурацию. Вы хотите дополнительно ограничить информацию, полученную в результате исключения полей описания, категории, канала и данных. Скопируйте эту функциональность в xmlrpclib.
Python словарь (например, структура XML-RPC) и объявить список параметров.
>>> params = < ... [категория]: 7, ... ... 'time_period': '1hour', ... ... ... 'description': 0, ... ... ... 'Категория': 0, ... ... ... 'Channel': 0, ... ... 'Дата': 0. >
Первые два параметра определяют диапазон требуемой информации. Последние четыре — действуют как переключатели для деактивации различных возвращенных элементов. Далее вызывается метод сервера для получения необходимой информации.
>>>result = meerkatsvr.meerkat.getitems(params)
Это выражение возвращает словарный список, содержащий названия и HTML-ссылки всех статей Linux, появившихся на Meerkat за последний час. Если запрос возвращает пустой список, увеличьте время ожидания (два (2) часа или один (1) день).
Далее, давайте рассмотрим этот каталог и создадим полные HTML-ссылки на эти статьи.
>>> Для результата D:. ... print< a href=%s>%s</a> %(D, D [title])
Что мы получили в результате.
Такой подход дал нам несколько преимуществ. Улучшена читаемость кода. Требуется меньше кода. Отделив мнение от данных, мы могли бы легко выбрать альтернативу. Самое главное, что такой подход абсолютно соответствует духу языка Python. Благодаря функциям, встроенным в XML-RPC и XMLRPCLIB, ответ Meerkat сегодня — это данные Python. Он обладает всей необходимой гибкостью. Вы можете сделать все необходимое, хранить это в базе данных и отображать в WXPython или TKINTER. Или отправьте его другому клиенту через XML-RPC!