xmlrpc.client.md
1> **Источник:** https://python-all.ru/3.5/library/xmlrpc.client.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 21.26. [`xmlrpc.client`](https://python-all.ru/3.5/library/xmlrpc.client.html#module-xmlrpc.client) – клиентский доступ к XML-RPC89**Исходный код:** [Lib/xmlrpc/client.py](https://python-all.ru/src/3.5/Lib/xmlrpc/client.py)1011---1213XML-RPC – это метод удалённого вызова процедур (Remote Procedure Call), использующий XML, передаваемый через HTTP(S) в качестве транспорта. С его помощью клиент может вызывать методы с параметрами на удалённом сервере (сервер задаётся URI) и получать структурированные данные. Этот модуль предназначен для написания кода XML-RPC клиента; он берёт на себя все детали преобразования между совместимыми объектами Python и XML, передаваемыми по сети.1415> **Предупреждение**16>17> Модуль [`xmlrpc.client`](https://python-all.ru/3.5/library/xmlrpc.client.html#module-xmlrpc.client) не защищён от вредоносных данных. Если требуется разбирать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/3.5/library/xml.html#xml-vulnerabilities).1819Изменено в версии 3.5: Для HTTPS URI [`xmlrpc.client`](https://python-all.ru/3.5/library/xmlrpc.client.html#module-xmlrpc.client) теперь по умолчанию выполняет все необходимые проверки сертификата и имени хоста.2021#### `class xmlrpc.client.ServerProxy(uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False, use_builtin_types=False, *, context=None)`2223Изменено в версии 3.3: Добавлен флаг *use\_builtin\_types*.2425Экземпляр [`ServerProxy`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ServerProxy) – это объект, управляющий связью с удалённым XML-RPC сервером. Обязательный первый аргумент – URI (Uniform Resource Indicator), обычно это URL сервера. Второй необязательный аргумент – экземпляр транспортной фабрики; по умолчанию для URL https: используется внутренний экземпляр `SafeTransport`, а в остальных случаях – внутренний экземпляр HTTP `Transport`. Третий необязательный аргумент – кодировка, по умолчанию UTF-8. Четвёртый необязательный аргумент – флаг отладки.2627Следующие параметры управляют использованием возвращаемого экземпляра прокси. Если *allow\_none* равен true, константа Python `None` будет преобразована в XML; по умолчанию `None` вызывает исключение [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError). Это часто используемое расширение спецификации XML-RPC, но оно поддерживается не всеми клиентами и серверами; описание см. на [http://ontosys.com/xml-rpc/extensions.php](https://python-all.ru/3.5/library/xmlrpc.client.html). Флаг *use\_builtin\_types* можно использовать, чтобы значения даты/времени представлялись как объекты [`datetime.datetime`](https://python-all.ru/3.5/library/datetime.html#datetime.datetime), а двоичные данные – как объекты [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes); по умолчанию этот флаг равен false. Объекты [`datetime.datetime`](https://python-all.ru/3.5/library/datetime.html#datetime.datetime), [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) и [`bytearray`](https://python-all.ru/3.5/library/functions.html#bytearray) могут передаваться в вызовы. Устаревший флаг *use\_datetime* аналогичен *use\_builtin\_types*, но применяется только к значениям даты/времени.2829Как HTTP-, так и HTTPS-транспорты поддерживают расширение синтаксиса URL для базовой аутентификации HTTP: `http://user:pass@host:port/path`. Часть `user:pass` будет закодирована в base64 как HTTP-заголовок 'Authorization' и отправлена на удалённый сервер в процессе подключения при вызове метода XML-RPC. Это нужно использовать только в том случае, если удалённый сервер требует имя пользователя и пароль для базовой аутентификации. Если указан HTTPS URL, *context* может быть [`ssl.SSLContext`](https://python-all.ru/3.5/library/ssl.html#ssl.SSLContext) и настраивает параметры SSL нижележащего HTTPS-соединения.3031Возвращаемый экземпляр – это прокси-объект с методами, которые можно использовать для вызова соответствующих RPC-вызовов на удалённом сервере. Если удалённый сервер поддерживает API интроспекции, прокси также можно использовать для запроса методов, которые он поддерживает (обнаружение служб), и получения других метаданных, связанных с сервером.3233Типы, которые являются совместимыми (т.е. могут быть преобразованы в XML), включают следующие (и, если не указано иное, они десериализуются как те же типы Python):3435| Тип XML-RPC | Тип Python |36| --- | --- |37| `boolean` | [`bool`](https://python-all.ru/3.5/library/functions.html#bool) |38| `int` или `i4` | [`int`](https://python-all.ru/3.5/library/functions.html#int) находится в диапазоне от -2147483648 до 2147483647. |39| `double` | [`float`](https://python-all.ru/3.5/library/functions.html#float) |40| `string` | [`str`](https://python-all.ru/3.5/library/stdtypes.html#str) |41| `array` | [`list`](https://python-all.ru/3.5/library/stdtypes.html#list) или [`tuple`](https://python-all.ru/3.5/library/stdtypes.html#tuple), содержащие совместимые элементы. Массивы возвращаются как [`lists`](https://python-all.ru/3.5/library/stdtypes.html#list). |42| `struct` | [`dict`](https://python-all.ru/3.5/library/stdtypes.html#dict). Ключи должны быть строками, значения могут быть любого совместимого типа. Можно передавать объекты пользовательских классов; передаётся только их атрибут [`__dict__`](https://python-all.ru/3.5/library/stdtypes.html#object.__dict__). |43| `dateTime.iso8601` | [`DateTime`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.DateTime) или [`datetime.datetime`](https://python-all.ru/3.5/library/datetime.html#datetime.datetime). Возвращаемый тип зависит от значений флагов *use\_builtin\_types* и *use\_datetime*. |44| `base64` | [`Binary`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Binary), [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) или [`bytearray`](https://python-all.ru/3.5/library/functions.html#bytearray). Возвращаемый тип зависит от значения флага *use\_builtin\_types*. |45| `nil` | Константа `None`. Передача разрешена только если *allow\_none* равен true. |4647Это полный набор типов данных, поддерживаемых XML-RPC. Вызовы методов также могут возбуждать специальный экземпляр [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault) для сообщения об ошибках XML-RPC сервера, или [`ProtocolError`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ProtocolError) для сообщения об ошибке в транспортном слое HTTP/HTTPS. И [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault), и [`ProtocolError`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ProtocolError) наследуются от базового класса `Error`. Обратите внимание, что модуль xmlrpc.client в настоящее время не выполняет маршалинг экземпляров подклассов встроенных типов.4849При передаче строк символы, специальные для XML, такие как `<`, `>` и `&`, автоматически экранируются. Однако вызывающая сторона должна гарантировать, что строка не содержит символов, запрещённых в XML, например управляющих символов с ASCII-кодами от 0 до 31 (за исключением табуляции, новой строки и возврата каретки); несоблюдение этого требования приведёт к тому, что XML-RPC запрос не будет корректным XML. Если необходимо передать произвольные байты через XML-RPC, используйте классы [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) или [`bytearray`](https://python-all.ru/3.5/library/functions.html#bytearray), или класс-обёртку [`Binary`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Binary), описанный ниже.5051`Server` сохранён как псевдоним для [`ServerProxy`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ServerProxy) для обратной совместимости. В новом коде следует использовать [`ServerProxy`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ServerProxy).5253Изменено в версии 3.5: Добавлен аргумент *context*.5455> **См. также**56>57> **[Руководство по XML-RPC](https://python-all.ru/3.5/library/xmlrpc.client.html)**58>59> Хорошее описание работы XML-RPC и клиентского ПО на нескольких языках. Содержит практически всё, что нужно знать разработчику XML-RPC клиента.60>61> **[Интроспекция XML-RPC](https://python-all.ru/3.5/library/xmlrpc.client.html)**62>63> Описывает расширение протокола XML-RPC для интроспекции.64>65> **[Спецификация XML-RPC](https://python-all.ru/3.5/library/xmlrpc.client.html)**66>67> Официальная спецификация.68>69> **[Неофициальные исправления XML-RPC](https://python-all.ru/3.5/library/xmlrpc.client.html)**70>71> «Неофициальные исправления» Фредрика Лунда, предназначенные для разъяснения некоторых деталей спецификации XML-RPC, а также для указания на «лучшие практики» при разработке собственных реализаций XML-RPC.7273## 21.26.1. Объекты ServerProxy7475Экземпляр [`ServerProxy`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ServerProxy) имеет метод, соответствующий каждому удаленному вызову процедуры, принимаемому XML-RPC сервером. Вызов метода выполняет RPC, диспетчеризуемый по имени и сигнатуре аргументов (например, одно и то же имя метода может быть перегружено несколькими сигнатурами аргументов). RPC завершается возвратом значения, которое может быть либо возвращенными данными в совместимом типе, либо [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault) или [`ProtocolError`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ProtocolError) объектом, указывающим на ошибку.7677Серверы, поддерживающие API интроспекции XML, предоставляют несколько общих методов, сгруппированных в зарезервированном атрибуте `system`:7879#### `ServerProxy.system.listMethods()`8081Этот метод возвращает список строк, по одной для каждого (не системного) метода, поддерживаемого XML-RPC сервером.8283#### `ServerProxy.system.methodSignature(name)`8485Этот метод принимает один параметр – имя метода, реализованного XML-RPC сервером. Он возвращает массив возможных сигнатур для этого метода. Сигнатура – это массив типов. Первый из этих типов – возвращаемый тип метода, остальные – параметры.8687Поскольку допускается несколько сигнатур (т.е. перегрузка), этот метод возвращает список сигнатур, а не один элемент.8889Сигнатуры ограничены параметрами верхнего уровня, ожидаемыми методом. Например, если метод ожидает один массив структур в качестве параметра и возвращает строку, его сигнатура – просто «string, array». Если он ожидает три целых числа и возвращает строку, его сигнатура – «string, int, int, int».9091Если для метода не определена сигнатура, возвращается не-массив. В Python это означает, что тип возвращаемого значения будет чем-то отличным от list.9293#### `ServerProxy.system.methodHelp(name)`9495Этот метод принимает один параметр – имя метода, реализованного XML-RPC сервером. Он возвращает строку документации, описывающую использование этого метода. Если такая строка отсутствует, возвращается пустая строка. Строка документации может содержать HTML-разметку.9697Изменено в версии 3.5: Экземпляры [`ServerProxy`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ServerProxy) поддерживают протокол [менеджера контекста](https://python-all.ru/3.5/glossary.html#term-context-manager) для закрытия нижележащего транспорта.9899Далее следует работающий пример. Код сервера:100101```python102from xmlrpc.server import SimpleXMLRPCServer103104def is_even(n):105 return n % 2 == 0106107server = SimpleXMLRPCServer(("localhost", 8000))108print("Listening on port 8000...")109server.register_function(is_even, "is_even")110server.serve_forever()111```112113Клиентский код для указанного сервера:114115```python116import xmlrpc.client117118with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:119 print("3 is even: %s" % str(proxy.is_even(3)))120 print("100 is even: %s" % str(proxy.is_even(100)))121```122123## 21.26.2. Объекты DateTime124125#### `class xmlrpc.client.DateTime`126127Этот класс можно инициализировать секундами с начала эпохи, временным кортежем, строкой даты/времени в формате ISO 8601 или экземпляром [`datetime.datetime`](https://python-all.ru/3.5/library/datetime.html#datetime.datetime). Он имеет следующие методы, поддерживаемые в основном для внутреннего использования кодом маршалинга/демаршалинга:128129#### `decode(string)`130131Принимает строку в качестве нового значения времени экземпляра.132133#### `encode(out)`134135Записывает XML-RPC кодировку этого элемента [`DateTime`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.DateTime) в потоковый объект *out* .136137Он также поддерживает некоторые встроенные операторы Python через методы rich comparison и [`__repr__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__repr__).138139Далее следует работающий пример. Код сервера:140141```python142import datetime143from xmlrpc.server import SimpleXMLRPCServer144import xmlrpc.client145146def today():147 today = datetime.datetime.today()148 return xmlrpc.client.DateTime(today)149150server = SimpleXMLRPCServer(("localhost", 8000))151print("Listening on port 8000...")152server.register_function(today, "today")153server.serve_forever()154```155156Клиентский код для указанного сервера:157158```python159import xmlrpc.client160import datetime161162proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")163164today = proxy.today()165# преобразует строку в формате ISO8601 в объект datetime166converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")167print("Today: %s" % converted.strftime("%d.%m.%Y, %H:%M"))168```169170## 21.26.3. Объекты Binary171172#### `class xmlrpc.client.Binary`173174Этот класс можно инициализировать данными bytes (которые могут содержать NUL-символы). Основной доступ к содержимому объекта [`Binary`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Binary) предоставляется через атрибут:175176#### `data`177178Двоичные данные, инкапсулированные экземпляром [`Binary`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Binary). Данные предоставляются как объект [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes).179180Объекты [`Binary`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Binary) имеют следующие методы, предназначенные в основном для внутреннего использования кодом маршалинга/демаршалинга:181182#### `decode(bytes)`183184Принимает объект base64 [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes) и декодирует его как новые данные экземпляра.185186#### `encode(out)`187188Записывает XML-RPC base64-кодировку этого двоичного объекта в потоковый объект *out*.189190Закодированные данные будут содержать символы новой строки каждые 76 символов согласно [RFC 2045, раздел 6.8](https://python-all.ru/3.5/library/xmlrpc.client.html), что было фактическим стандартом спецификации base64 на момент написания спецификации XML-RPC.191192Он также поддерживает некоторые встроенные операторы Python через [`__eq__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__eq__) и [`__ne__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__ne__).193194Пример использования двоичных объектов. Мы собираемся передать изображение через XMLRPC:195196```python197from xmlrpc.server import SimpleXMLRPCServer198import xmlrpc.client199200def python_logo():201 with open("python_logo.jpg", "rb") as handle:202 return xmlrpc.client.Binary(handle.read())203204server = SimpleXMLRPCServer(("localhost", 8000))205print("Listening on port 8000...")206server.register_function(python_logo, 'python_logo')207208server.serve_forever()209```210211Клиент получает изображение и сохраняет его в файл:212213```python214import xmlrpc.client215216proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")217with open("fetched_python_logo.jpg", "wb") as handle:218 handle.write(proxy.python_logo().data)219```220221## 21.26.4. Объекты Fault222223#### `class xmlrpc.client.Fault`224225Объект [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault) инкапсулирует содержимое тега ошибки (fault tag) XML-RPC. Объекты Fault имеют следующие атрибуты:226227#### `faultCode`228229Строка, указывающая тип ошибки.230231#### `faultString`232233Строка, содержащая диагностическое сообщение, связанное с ошибкой.234235В следующем примере мы намеренно вызовем [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault), возвращая объект сложного типа. Код сервера:236237```python238from xmlrpc.server import SimpleXMLRPCServer239240# Произойдёт ошибка маршалинга, потому что возвращается241# комплексное число242def add(x, y):243 return x+y+0j244245server = SimpleXMLRPCServer(("localhost", 8000))246print("Listening on port 8000...")247server.register_function(add, 'add')248249server.serve_forever()250```251252Клиентский код для указанного сервера:253254```python255import xmlrpc.client256257proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")258try:259 proxy.add(2, 5)260except xmlrpc.client.Fault as err:261 print("A fault occurred")262 print("Fault code: %d" % err.faultCode)263 print("Fault string: %s" % err.faultString)264```265266## 21.26.5. Объекты ProtocolError267268#### `class xmlrpc.client.ProtocolError`269270Объект [`ProtocolError`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ProtocolError) описывает протокольную ошибку на уровне нижележащего транспорта (например, ошибку 404 «не найдено», если сервер по указанному URI не существует). Он имеет следующие атрибуты:271272#### `url`273274URI или URL, вызвавший ошибку.275276#### `errcode`277278Код ошибки.279280#### `errmsg`281282Сообщение об ошибке или диагностическая строка.283284#### `headers`285286Словарь (dict), содержащий заголовки HTTP/HTTPS-запроса, вызвавшего ошибку.287288В следующем примере мы намеренно вызовем [`ProtocolError`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.ProtocolError), предоставив неверный URI:289290```python291import xmlrpc.client292293# Создание ServerProxy с URI, который не отвечает на XMLRPC-запросы294proxy = xmlrpc.client.ServerProxy("http://google.com/")295296try:297 proxy.some_method()298except xmlrpc.client.ProtocolError as err:299 print("A protocol error occurred")300 print("URL: %s" % err.url)301 print("HTTP/HTTPS headers: %s" % err.headers)302 print("Error code: %d" % err.errcode)303 print("Error message: %s" % err.errmsg)304```305306## 21.26.6. Объекты MultiCall307308Объект [`MultiCall`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.MultiCall) позволяет инкапсулировать несколько вызовов к удалённому серверу в один запрос [\[1\]](https://python-all.ru/3.5/library/xmlrpc.client.html#id6).309310#### `class xmlrpc.client.MultiCall(server)`311312Создаёт объект для группировки вызовов методов. *server* – конечная цель вызова. Вызовы могут направляться результирующему объекту, но они сразу же возвращают `None`, и сохраняют только имя метода и параметры в объект [`MultiCall`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.MultiCall). Вызов самого объекта приводит к передаче всех сохранённых вызовов в виде одного запроса `system.multicall`. Результатом этого вызова является [generator](https://python-all.ru/3.5/glossary.html#term-generator); итерация по этому генератору даёт отдельные результаты.313314Далее приведён пример использования этого класса. Серверный код:315316```python317from xmlrpc.server import SimpleXMLRPCServer318319def add(x, y):320 return x + y321322def subtract(x, y):323 return x - y324325def multiply(x, y):326 return x * y327328def divide(x, y):329 return x // y330331# Простой сервер с простыми арифметическими функциями332server = SimpleXMLRPCServer(("localhost", 8000))333print("Listening on port 8000...")334server.register_multicall_functions()335server.register_function(add, 'add')336server.register_function(subtract, 'subtract')337server.register_function(multiply, 'multiply')338server.register_function(divide, 'divide')339server.serve_forever()340```341342Клиентский код для указанного сервера:343344```python345import xmlrpc.client346347proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")348multicall = xmlrpc.client.MultiCall(proxy)349multicall.add(7, 3)350multicall.subtract(7, 3)351multicall.multiply(7, 3)352multicall.divide(7, 3)353result = multicall()354355print("7+3=%d, 7-3=%d, 7*3=%d, 7//3=%d" % tuple(result))356```357358## 21.26.7. Удобные функции359360#### `xmlrpc.client.dumps(params, methodname=None, methodresponse=None, encoding=None, allow_none=False)`361362Преобразует *params* в запрос XML-RPC. Или в ответ, если *methodresponse* истинно. *params* может быть кортежем аргументов или экземпляром [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault) класса исключения. Если *methodresponse* истинно, только одно значение может быть возвращено, то есть *params* должен иметь длину 1. *encoding*, если указан, это кодировка для генерируемого XML; по умолчанию UTF-8. Значение [`None`](https://python-all.ru/3.5/library/constants.html#None) Python не может использоваться в стандартном XML-RPC; чтобы разрешить его использование через расширение, передайте истинное значение для *allow\_none*.363364#### `xmlrpc.client.loads(data, use_datetime=False, use_builtin_types=False)`365366Преобразует XML-RPC запрос или ответ в объекты Python, `(params, methodname)`. *params* – кортеж аргументов; *methodname* – строка или `None`, если имя метода отсутствует в пакете. Если XML-RPC пакет представляет собой условие ошибки, эта функция возбуждает исключение [`Fault`](https://python-all.ru/3.5/library/xmlrpc.client.html#xmlrpc.client.Fault). Флаг *use\_builtin\_types* можно использовать, чтобы значения даты/времени представлялись как объекты [`datetime.datetime`](https://python-all.ru/3.5/library/datetime.html#datetime.datetime), а бинарные данные – как объекты [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes); по умолчанию этот флаг выключен.367368Устаревший флаг *use\_datetime* похож на *use\_builtin\_types*, но применяется только к значениям даты/времени.369370Изменено в версии 3.3: Добавлен флаг *use\_builtin\_types*.371372## 21.26.8. Пример использования клиента373374```python375# простая тестовая программа (из спецификации XML-RPC)376from xmlrpc.client import ServerProxy, Error377378# server = ServerProxy("http://localhost:8000") # локальный сервер379with ServerProxy("http://betty.userland.com") as proxy:380381 print(proxy)382383 try:384 print(proxy.examples.getStateName(41))385 except Error as v:386 print("ERROR", v)387```388389Для доступа к XML-RPC серверу через HTTP-прокси необходимо определить собственный транспорт. В следующем примере показано, как это сделать:390391```python392import http.client393import xmlrpc.client394395class ProxiedTransport(xmlrpc.client.Transport):396397 def set_proxy(self, host, port=None, headers=None):398 self.proxy = host, port399 self.proxy_headers = headers400401 def make_connection(self, host):402 connection = http.client.HTTPConnection(*self.proxy)403 connection.set_tunnel(host, headers=self.proxy_headers)404 self._connection = host, connection405 return connection406407transport = ProxiedTransport()408transport.set_proxy('proxy-server', 8080)409server = xmlrpc.client.ServerProxy('http://betty.userland.com', transport=transport)410print(server.examples.getStateName(41))411```412413## 21.26.9. Пример использования клиента и сервера414415См. [пример SimpleXMLRPCServer](https://python-all.ru/3.5/library/xmlrpc.server.html#simplexmlrpcserver-example).416417Сноски418419| [\[1\]](https://python-all.ru/3.5/library/xmlrpc.client.html#id5) | Этот подход был впервые представлен в [обсуждении на xmlrpc.com](https://python-all.ru/3.5/library/xmlrpc.client.html). |420| --- | --- |421