blob: e818c3de6ab1a66f9e6642c30332a5e72ac86d47 [file] [log] [blame]
Georg Brandl8ec7f652007-08-15 14:28:01 +00001:mod:`xmlrpclib` --- XML-RPC client access
2==========================================
3
4.. module:: xmlrpclib
5 :synopsis: XML-RPC client access.
6.. moduleauthor:: Fredrik Lundh <fredrik@pythonware.com>
7.. sectionauthor:: Eric S. Raymond <esr@snark.thyrsus.com>
8
Georg Brandle2caef72008-05-26 10:47:43 +00009.. note::
10 The :mod:`xmlrpclib` module has been renamed to :mod:`xmlrpc.client` in
Ezio Melotti510ff542012-05-03 19:21:40 +030011 Python 3. The :term:`2to3` tool will automatically adapt imports when
12 converting your sources to Python 3.
Georg Brandle2caef72008-05-26 10:47:43 +000013
Georg Brandl8ec7f652007-08-15 14:28:01 +000014
Georg Brandlb19be572007-12-29 10:57:00 +000015.. XXX Not everything is documented yet. It might be good to describe
16 Marshaller, Unmarshaller, getparser, dumps, loads, and Transport.
Georg Brandl8ec7f652007-08-15 14:28:01 +000017
18.. versionadded:: 2.2
19
Éric Araujo29a0b572011-08-19 02:14:03 +020020**Source code:** :source:`Lib/xmlrpclib.py`
21
22--------------
23
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030024XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP(S) as a
Georg Brandl8ec7f652007-08-15 14:28:01 +000025transport. With it, a client can call methods with parameters on a remote
26server (the server is named by a URI) and get back structured data. This module
27supports writing XML-RPC client code; it handles all the details of translating
28between conformable Python objects and XML on the wire.
29
30
Christian Heimes23790b42013-03-26 17:53:05 +010031.. warning::
32
33 The :mod:`xmlrpclib` module is not secure against maliciously
34 constructed data. If you need to parse untrusted or unauthenticated data see
35 :ref:`xml-vulnerabilities`.
36
Benjamin Petersone3e7d402014-11-23 21:02:02 -060037.. versionchanged:: 2.7.9
Benjamin Peterson078ece22014-10-13 11:53:54 -040038
Martin Panter57204932016-05-28 02:33:05 +000039 For HTTPS URIs, :mod:`xmlrpclib` now performs all the necessary certificate
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030040 and hostname checks by default.
Christian Heimes23790b42013-03-26 17:53:05 +010041
Benjamin Petersonefa3cf82014-11-29 22:55:35 -050042.. class:: ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime[, context]]]]]])
Georg Brandl8ec7f652007-08-15 14:28:01 +000043
44 A :class:`ServerProxy` instance is an object that manages communication with a
45 remote XML-RPC server. The required first argument is a URI (Uniform Resource
46 Indicator), and will normally be the URL of the server. The optional second
47 argument is a transport factory instance; by default it is an internal
48 :class:`SafeTransport` instance for https: URLs and an internal HTTP
49 :class:`Transport` instance otherwise. The optional third argument is an
50 encoding, by default UTF-8. The optional fourth argument is a debugging flag.
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030051
52 The following parameters govern the use of the returned proxy instance.
Georg Brandl8ec7f652007-08-15 14:28:01 +000053 If *allow_none* is true, the Python constant ``None`` will be translated into
54 XML; the default behaviour is for ``None`` to raise a :exc:`TypeError`. This is
55 a commonly-used extension to the XML-RPC specification, but isn't supported by
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030056 all clients and servers; see `http://ontosys.com/xml-rpc/extensions.php
Serhiy Storchakac145da02016-05-07 10:06:53 +030057 <https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php>`_
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030058 for a description.
59 The *use_datetime* flag can be used to cause date/time values to
Georg Brandl8ec7f652007-08-15 14:28:01 +000060 be presented as :class:`datetime.datetime` objects; this is false by default.
Andrew M. Kuchling085f75a2008-02-23 16:23:05 +000061 :class:`datetime.datetime` objects may be passed to calls.
Georg Brandl8ec7f652007-08-15 14:28:01 +000062
63 Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
Benjamin Petersonefa3cf82014-11-29 22:55:35 -050064 Basic Authentication: ``http://user:pass@host:port/path``. The ``user:pass``
Georg Brandl8ec7f652007-08-15 14:28:01 +000065 portion will be base64-encoded as an HTTP 'Authorization' header, and sent to
66 the remote server as part of the connection process when invoking an XML-RPC
67 method. You only need to use this if the remote server requires a Basic
Martin Panter57204932016-05-28 02:33:05 +000068 Authentication user and password. If an HTTPS URL is provided, *context* may
Benjamin Petersonefa3cf82014-11-29 22:55:35 -050069 be :class:`ssl.SSLContext` and configures the SSL settings of the underlying
70 HTTPS connection.
Georg Brandl8ec7f652007-08-15 14:28:01 +000071
72 The returned instance is a proxy object with methods that can be used to invoke
73 corresponding RPC calls on the remote server. If the remote server supports the
74 introspection API, the proxy can also be used to query the remote server for the
75 methods it supports (service discovery) and fetch other server-associated
76 metadata.
77
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030078 Types that are conformable (e.g. that can be marshalled through XML),
79 include the following (and except where noted, they are unmarshalled
80 as the same Python type):
Georg Brandl8ec7f652007-08-15 14:28:01 +000081
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030082 .. tabularcolumns:: |l|L|
83
84 +----------------------+-------------------------------------------------------+
85 | XML-RPC type | Python type |
86 +======================+=======================================================+
87 | ``boolean`` | :class:`bool` |
88 +----------------------+-------------------------------------------------------+
89 | ``int`` or ``i4`` | :class:`int` or :class:`long` in range from |
90 | | -2147483648 to 2147483647. |
91 +----------------------+-------------------------------------------------------+
92 | ``double`` | :class:`float` |
93 +----------------------+-------------------------------------------------------+
94 | ``string`` | :class:`str` or :class:`unicode` |
95 +----------------------+-------------------------------------------------------+
96 | ``array`` | :class:`list` or :class:`tuple` containing |
97 | | conformable elements. Arrays are returned as |
Serhiy Storchakac145da02016-05-07 10:06:53 +030098 | | :class:`lists <list>`. |
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +030099 +----------------------+-------------------------------------------------------+
100 | ``struct`` | :class:`dict`. Keys must be strings, values may be |
101 | | any conformable type. Objects of user-defined |
Serhiy Storchakac145da02016-05-07 10:06:53 +0300102 | | classes can be passed in; only their |
103 | | :attr:`~object.__dict__` attribute is transmitted. |
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300104 +----------------------+-------------------------------------------------------+
105 | ``dateTime.iso8601`` | :class:`DateTime` or :class:`datetime.datetime`. |
106 | | Returned type depends on values of the *use_datetime* |
107 | | flags. |
108 +----------------------+-------------------------------------------------------+
109 | ``base64`` | :class:`Binary` |
110 +----------------------+-------------------------------------------------------+
111 | ``nil`` | The ``None`` constant. Passing is allowed only if |
112 | | *allow_none* is true. |
113 +----------------------+-------------------------------------------------------+
Georg Brandl8ec7f652007-08-15 14:28:01 +0000114
115 This is the full set of data types supported by XML-RPC. Method calls may also
116 raise a special :exc:`Fault` instance, used to signal XML-RPC server errors, or
117 :exc:`ProtocolError` used to signal an error in the HTTP/HTTPS transport layer.
118 Both :exc:`Fault` and :exc:`ProtocolError` derive from a base class called
119 :exc:`Error`. Note that even though starting with Python 2.2 you can subclass
Georg Brandld7d4fd72009-07-26 14:37:28 +0000120 built-in types, the xmlrpclib module currently does not marshal instances of such
Georg Brandl8ec7f652007-08-15 14:28:01 +0000121 subclasses.
122
123 When passing strings, characters special to XML such as ``<``, ``>``, and ``&``
124 will be automatically escaped. However, it's the caller's responsibility to
125 ensure that the string is free of characters that aren't allowed in XML, such as
126 the control characters with ASCII values between 0 and 31 (except, of course,
127 tab, newline and carriage return); failing to do this will result in an XML-RPC
128 request that isn't well-formed XML. If you have to pass arbitrary strings via
129 XML-RPC, use the :class:`Binary` wrapper class described below.
130
131 :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
132 compatibility. New code should use :class:`ServerProxy`.
133
134 .. versionchanged:: 2.5
135 The *use_datetime* flag was added.
136
137 .. versionchanged:: 2.6
Georg Brandla7395032007-10-21 12:15:05 +0000138 Instances of :term:`new-style class`\es can be passed in if they have an
139 *__dict__* attribute and don't have a base class that is marshalled in a
140 special way.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000141
Benjamin Petersonefa3cf82014-11-29 22:55:35 -0500142 .. versionchanged:: 2.7.9
143 Added the *context* argument.
144
Georg Brandl8ec7f652007-08-15 14:28:01 +0000145
146.. seealso::
147
148 `XML-RPC HOWTO <http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html>`_
Andrew M. Kuchlingde680372008-01-11 19:33:24 +0000149 A good description of XML-RPC operation and client software in several languages.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000150 Contains pretty much everything an XML-RPC client developer needs to know.
151
Andrew M. Kuchlingde680372008-01-11 19:33:24 +0000152 `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
153 Describes the XML-RPC protocol extension for introspection.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000154
Skip Montanaro6d9aafa2008-04-22 22:45:09 +0000155 `XML-RPC Specification <http://www.xmlrpc.com/spec>`_
156 The official specification.
157
158 `Unofficial XML-RPC Errata <http://effbot.org/zone/xmlrpc-errata.htm>`_
159 Fredrik Lundh's "unofficial errata, intended to clarify certain
160 details in the XML-RPC specification, as well as hint at
161 'best practices' to use when designing your own XML-RPC
162 implementations."
Georg Brandl8ec7f652007-08-15 14:28:01 +0000163
164.. _serverproxy-objects:
165
166ServerProxy Objects
167-------------------
168
169A :class:`ServerProxy` instance has a method corresponding to each remote
170procedure call accepted by the XML-RPC server. Calling the method performs an
171RPC, dispatched by both name and argument signature (e.g. the same method name
172can be overloaded with multiple argument signatures). The RPC finishes by
173returning a value, which may be either returned data in a conformant type or a
174:class:`Fault` or :class:`ProtocolError` object indicating an error.
175
176Servers that support the XML introspection API support some common methods
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300177grouped under the reserved :attr:`~ServerProxy.system` attribute:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000178
179
180.. method:: ServerProxy.system.listMethods()
181
182 This method returns a list of strings, one for each (non-system) method
183 supported by the XML-RPC server.
184
185
186.. method:: ServerProxy.system.methodSignature(name)
187
188 This method takes one parameter, the name of a method implemented by the XML-RPC
Georg Brandlf5f045e2009-05-04 20:45:13 +0000189 server. It returns an array of possible signatures for this method. A signature
Georg Brandl8ec7f652007-08-15 14:28:01 +0000190 is an array of types. The first of these types is the return type of the method,
191 the rest are parameters.
192
193 Because multiple signatures (ie. overloading) is permitted, this method returns
194 a list of signatures rather than a singleton.
195
196 Signatures themselves are restricted to the top level parameters expected by a
197 method. For instance if a method expects one array of structs as a parameter,
198 and it returns a string, its signature is simply "string, array". If it expects
199 three integers and returns a string, its signature is "string, int, int, int".
200
201 If no signature is defined for the method, a non-array value is returned. In
202 Python this means that the type of the returned value will be something other
Georg Brandlf5f045e2009-05-04 20:45:13 +0000203 than list.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000204
205
206.. method:: ServerProxy.system.methodHelp(name)
207
208 This method takes one parameter, the name of a method implemented by the XML-RPC
209 server. It returns a documentation string describing the use of that method. If
210 no such string is available, an empty string is returned. The documentation
211 string may contain HTML markup.
212
Georg Brandl8ec7f652007-08-15 14:28:01 +0000213
214.. _boolean-objects:
215
216Boolean Objects
217---------------
218
219This class may be initialized from any Python value; the instance returned
220depends only on its truth value. It supports various Python operators through
221:meth:`__cmp__`, :meth:`__repr__`, :meth:`__int__`, and :meth:`__nonzero__`
222methods, all implemented in the obvious ways.
223
224It also has the following method, supported mainly for internal use by the
225unmarshalling code:
226
227
228.. method:: Boolean.encode(out)
229
230 Write the XML-RPC encoding of this Boolean item to the out stream object.
231
Georg Brandl0a0cf162007-12-03 20:03:46 +0000232A working example follows. The server code::
233
234 import xmlrpclib
235 from SimpleXMLRPCServer import SimpleXMLRPCServer
236
237 def is_even(n):
Serhiy Storchaka12d547a2016-05-10 13:45:32 +0300238 return n % 2 == 0
Georg Brandl0a0cf162007-12-03 20:03:46 +0000239
240 server = SimpleXMLRPCServer(("localhost", 8000))
241 print "Listening on port 8000..."
242 server.register_function(is_even, "is_even")
243 server.serve_forever()
244
245The client code for the preceding server::
246
247 import xmlrpclib
248
249 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
250 print "3 is even: %s" % str(proxy.is_even(3))
251 print "100 is even: %s" % str(proxy.is_even(100))
Georg Brandl8ec7f652007-08-15 14:28:01 +0000252
253.. _datetime-objects:
254
255DateTime Objects
256----------------
257
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300258.. class:: DateTime
259
260 This class may be initialized with seconds since the epoch, a time
261 tuple, an ISO 8601 time/date string, or a :class:`datetime.datetime`
262 instance. It has the following methods, supported mainly for internal
263 use by the marshalling/unmarshalling code:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000264
265
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300266 .. method:: decode(string)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000267
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300268 Accept a string as the instance's new time value.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000269
270
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300271 .. method:: encode(out)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000272
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300273 Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream
274 object.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000275
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300276 It also supports certain of Python's built-in operators through :meth:`__cmp__`
277 and :meth:`__repr__` methods.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000278
Georg Brandl0a0cf162007-12-03 20:03:46 +0000279A working example follows. The server code::
280
281 import datetime
282 from SimpleXMLRPCServer import SimpleXMLRPCServer
283 import xmlrpclib
284
285 def today():
286 today = datetime.datetime.today()
287 return xmlrpclib.DateTime(today)
288
289 server = SimpleXMLRPCServer(("localhost", 8000))
290 print "Listening on port 8000..."
291 server.register_function(today, "today")
292 server.serve_forever()
293
294The client code for the preceding server::
295
296 import xmlrpclib
297 import datetime
298
299 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
300
301 today = proxy.today()
302 # convert the ISO8601 string to a datetime object
303 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
304 print "Today: %s" % converted.strftime("%d.%m.%Y, %H:%M")
Georg Brandl8ec7f652007-08-15 14:28:01 +0000305
306.. _binary-objects:
307
308Binary Objects
309--------------
310
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300311.. class:: Binary
312
313 This class may be initialized from string data (which may include NULs). The
314 primary access to the content of a :class:`Binary` object is provided by an
315 attribute:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000316
317
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300318 .. attribute:: data
Georg Brandl8ec7f652007-08-15 14:28:01 +0000319
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300320 The binary data encapsulated by the :class:`Binary` instance. The data is
321 provided as an 8-bit string.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000322
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300323 :class:`Binary` objects have the following methods, supported mainly for
324 internal use by the marshalling/unmarshalling code:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000325
326
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300327 .. method:: decode(string)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000328
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300329 Accept a base64 string and decode it as the instance's new data.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000330
331
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300332 .. method:: encode(out)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000333
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300334 Write the XML-RPC base 64 encoding of this binary item to the *out* stream object.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000335
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300336 The encoded data will have newlines every 76 characters as per
Serhiy Storchakab4905ef2016-05-07 10:50:12 +0300337 `RFC 2045 section 6.8 <https://tools.ietf.org/html/rfc2045#section-6.8>`_,
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300338 which was the de facto standard base64 specification when the
339 XML-RPC spec was written.
Skip Montanaro6d9aafa2008-04-22 22:45:09 +0000340
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300341 It also supports certain of Python's built-in operators through a
342 :meth:`__cmp__` method.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000343
Georg Brandl0a0cf162007-12-03 20:03:46 +0000344Example usage of the binary objects. We're going to transfer an image over
345XMLRPC::
346
347 from SimpleXMLRPCServer import SimpleXMLRPCServer
348 import xmlrpclib
349
350 def python_logo():
Victor Stinner75d3fb12010-01-30 02:00:26 +0000351 with open("python_logo.jpg", "rb") as handle:
Georg Brandl34feea32009-02-07 12:21:17 +0000352 return xmlrpclib.Binary(handle.read())
Georg Brandl0a0cf162007-12-03 20:03:46 +0000353
354 server = SimpleXMLRPCServer(("localhost", 8000))
355 print "Listening on port 8000..."
356 server.register_function(python_logo, 'python_logo')
357
358 server.serve_forever()
359
360The client gets the image and saves it to a file::
361
362 import xmlrpclib
363
364 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
Victor Stinner75d3fb12010-01-30 02:00:26 +0000365 with open("fetched_python_logo.jpg", "wb") as handle:
Georg Brandl34feea32009-02-07 12:21:17 +0000366 handle.write(proxy.python_logo().data)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000367
368.. _fault-objects:
369
370Fault Objects
371-------------
372
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300373.. class:: Fault
374
375 A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault
376 objects have the following attributes:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000377
378
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300379 .. attribute:: faultCode
Georg Brandl8ec7f652007-08-15 14:28:01 +0000380
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300381 A string indicating the fault type.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000382
383
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300384 .. attribute:: faultString
Georg Brandl8ec7f652007-08-15 14:28:01 +0000385
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300386 A string containing a diagnostic message associated with the fault.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000387
Georg Brandl0a0cf162007-12-03 20:03:46 +0000388In the following example we're going to intentionally cause a :exc:`Fault` by
389returning a complex type object. The server code::
390
391 from SimpleXMLRPCServer import SimpleXMLRPCServer
392
393 # A marshalling error is going to occur because we're returning a
394 # complex number
Serhiy Storchaka12d547a2016-05-10 13:45:32 +0300395 def add(x, y):
Georg Brandl0a0cf162007-12-03 20:03:46 +0000396 return x+y+0j
397
398 server = SimpleXMLRPCServer(("localhost", 8000))
399 print "Listening on port 8000..."
400 server.register_function(add, 'add')
401
402 server.serve_forever()
403
404The client code for the preceding server::
405
406 import xmlrpclib
407
408 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
409 try:
410 proxy.add(2, 5)
Andrew Svetlov1625d882012-10-30 21:56:43 +0200411 except xmlrpclib.Fault as err:
Benjamin Peterson90f36732008-07-12 20:16:19 +0000412 print "A fault occurred"
Georg Brandl0a0cf162007-12-03 20:03:46 +0000413 print "Fault code: %d" % err.faultCode
414 print "Fault string: %s" % err.faultString
415
416
Georg Brandl8ec7f652007-08-15 14:28:01 +0000417
418.. _protocol-error-objects:
419
420ProtocolError Objects
421---------------------
422
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300423.. class:: ProtocolError
424
425 A :class:`ProtocolError` object describes a protocol error in the underlying
426 transport layer (such as a 404 'not found' error if the server named by the URI
427 does not exist). It has the following attributes:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000428
429
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300430 .. attribute:: url
Georg Brandl8ec7f652007-08-15 14:28:01 +0000431
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300432 The URI or URL that triggered the error.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000433
434
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300435 .. attribute:: errcode
Georg Brandl8ec7f652007-08-15 14:28:01 +0000436
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300437 The error code.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000438
439
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300440 .. attribute:: errmsg
Georg Brandl8ec7f652007-08-15 14:28:01 +0000441
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300442 The error message or diagnostic string.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000443
444
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300445 .. attribute:: headers
Georg Brandl8ec7f652007-08-15 14:28:01 +0000446
Serhiy Storchaka63d2fca2016-05-07 08:44:58 +0300447 A string containing the headers of the HTTP/HTTPS request that triggered the
448 error.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000449
Georg Brandl0a0cf162007-12-03 20:03:46 +0000450In the following example we're going to intentionally cause a :exc:`ProtocolError`
Martin Panter6a8163a2016-04-15 02:14:19 +0000451by providing a URI that doesn't point to an XMLRPC server::
Georg Brandl0a0cf162007-12-03 20:03:46 +0000452
453 import xmlrpclib
454
Martin Panter6a8163a2016-04-15 02:14:19 +0000455 # create a ServerProxy with a URI that doesn't respond to XMLRPC requests
Georg Brandl53ffca52010-01-30 17:57:48 +0000456 proxy = xmlrpclib.ServerProxy("http://www.google.com/")
Georg Brandl0a0cf162007-12-03 20:03:46 +0000457
458 try:
459 proxy.some_method()
Andrew Svetlov1625d882012-10-30 21:56:43 +0200460 except xmlrpclib.ProtocolError as err:
Benjamin Peterson90f36732008-07-12 20:16:19 +0000461 print "A protocol error occurred"
Georg Brandl0a0cf162007-12-03 20:03:46 +0000462 print "URL: %s" % err.url
463 print "HTTP/HTTPS headers: %s" % err.headers
464 print "Error code: %d" % err.errcode
465 print "Error message: %s" % err.errmsg
Georg Brandl8ec7f652007-08-15 14:28:01 +0000466
467MultiCall Objects
468-----------------
469
470.. versionadded:: 2.4
471
Sandro Tosi9b680922011-08-20 17:05:15 +0200472The :class:`MultiCall` object provides a way to encapsulate multiple calls to a
473remote server into a single request [#]_.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000474
475
476.. class:: MultiCall(server)
477
478 Create an object used to boxcar method calls. *server* is the eventual target of
479 the call. Calls can be made to the result object, but they will immediately
480 return ``None``, and only store the call name and parameters in the
481 :class:`MultiCall` object. Calling the object itself causes all stored calls to
482 be transmitted as a single ``system.multicall`` request. The result of this call
Georg Brandlcf3fb252007-10-21 10:52:38 +0000483 is a :term:`generator`; iterating over this generator yields the individual
484 results.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000485
Georg Brandl0a0cf162007-12-03 20:03:46 +0000486A usage example of this class follows. The server code ::
Georg Brandl8ec7f652007-08-15 14:28:01 +0000487
Georg Brandl0a0cf162007-12-03 20:03:46 +0000488 from SimpleXMLRPCServer import SimpleXMLRPCServer
489
490 def add(x,y):
491 return x+y
492
493 def subtract(x, y):
494 return x-y
495
496 def multiply(x, y):
497 return x*y
498
499 def divide(x, y):
500 return x/y
501
502 # A simple server with simple arithmetic functions
503 server = SimpleXMLRPCServer(("localhost", 8000))
504 print "Listening on port 8000..."
505 server.register_multicall_functions()
506 server.register_function(add, 'add')
507 server.register_function(subtract, 'subtract')
508 server.register_function(multiply, 'multiply')
509 server.register_function(divide, 'divide')
510 server.serve_forever()
511
512The client code for the preceding server::
513
514 import xmlrpclib
515
516 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
517 multicall = xmlrpclib.MultiCall(proxy)
518 multicall.add(7,3)
519 multicall.subtract(7,3)
520 multicall.multiply(7,3)
521 multicall.divide(7,3)
522 result = multicall()
523
524 print "7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000525
526
527Convenience Functions
528---------------------
529
530
531.. function:: boolean(value)
532
533 Convert any Python value to one of the XML-RPC Boolean constants, ``True`` or
534 ``False``.
535
536
537.. function:: dumps(params[, methodname[, methodresponse[, encoding[, allow_none]]]])
538
539 Convert *params* into an XML-RPC request. or into a response if *methodresponse*
540 is true. *params* can be either a tuple of arguments or an instance of the
541 :exc:`Fault` exception class. If *methodresponse* is true, only a single value
542 can be returned, meaning that *params* must be of length 1. *encoding*, if
543 supplied, is the encoding to use in the generated XML; the default is UTF-8.
544 Python's :const:`None` value cannot be used in standard XML-RPC; to allow using
545 it via an extension, provide a true value for *allow_none*.
546
547
548.. function:: loads(data[, use_datetime])
549
550 Convert an XML-RPC request or response into Python objects, a ``(params,
551 methodname)``. *params* is a tuple of argument; *methodname* is a string, or
552 ``None`` if no method name is present in the packet. If the XML-RPC packet
553 represents a fault condition, this function will raise a :exc:`Fault` exception.
554 The *use_datetime* flag can be used to cause date/time values to be presented as
Andrew M. Kuchling085f75a2008-02-23 16:23:05 +0000555 :class:`datetime.datetime` objects; this is false by default.
Georg Brandl8ec7f652007-08-15 14:28:01 +0000556
557 .. versionchanged:: 2.5
558 The *use_datetime* flag was added.
559
560
561.. _xmlrpc-client-example:
562
563Example of Client Usage
564-----------------------
565
566::
567
568 # simple test program (from the XML-RPC specification)
569 from xmlrpclib import ServerProxy, Error
570
571 # server = ServerProxy("http://localhost:8000") # local server
572 server = ServerProxy("http://betty.userland.com")
573
574 print server
575
576 try:
577 print server.examples.getStateName(41)
Andrew Svetlov1625d882012-10-30 21:56:43 +0200578 except Error as v:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000579 print "ERROR", v
580
Martin Panter3e858382016-02-22 09:10:54 +0000581To access an XML-RPC server through a HTTP proxy, you need to define a custom
Georg Brandlb19be572007-12-29 10:57:00 +0000582transport. The following example shows how:
Georg Brandl8ec7f652007-08-15 14:28:01 +0000583
Georg Brandlb19be572007-12-29 10:57:00 +0000584.. Example taken from http://lowlife.jp/nobonobo/wiki/xmlrpcwithproxy.html
Georg Brandl8ec7f652007-08-15 14:28:01 +0000585
586::
587
Benjamin Petersona7b55a32009-02-20 03:31:23 +0000588 import xmlrpclib, httplib
Georg Brandl8ec7f652007-08-15 14:28:01 +0000589
590 class ProxiedTransport(xmlrpclib.Transport):
591 def set_proxy(self, proxy):
592 self.proxy = proxy
Serhiy Storchaka12d547a2016-05-10 13:45:32 +0300593
Georg Brandl8ec7f652007-08-15 14:28:01 +0000594 def make_connection(self, host):
595 self.realhost = host
Martin Panter3e858382016-02-22 09:10:54 +0000596 h = httplib.HTTPConnection(self.proxy)
Georg Brandl7044b112009-01-03 21:04:55 +0000597 return h
Serhiy Storchaka12d547a2016-05-10 13:45:32 +0300598
Georg Brandl8ec7f652007-08-15 14:28:01 +0000599 def send_request(self, connection, handler, request_body):
600 connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
Serhiy Storchaka12d547a2016-05-10 13:45:32 +0300601
Georg Brandl8ec7f652007-08-15 14:28:01 +0000602 def send_host(self, connection, host):
603 connection.putheader('Host', self.realhost)
604
605 p = ProxiedTransport()
606 p.set_proxy('proxy-server:8080')
Martin Panter3e858382016-02-22 09:10:54 +0000607 server = xmlrpclib.ServerProxy('http://time.xmlrpc.com/RPC2', transport=p)
Georg Brandl8ec7f652007-08-15 14:28:01 +0000608 print server.currentTime.getCurrentTime()
609
Georg Brandl0a0cf162007-12-03 20:03:46 +0000610
611Example of Client and Server Usage
612----------------------------------
613
614See :ref:`simplexmlrpcserver-example`.
615
616
Sandro Tosi9b680922011-08-20 17:05:15 +0200617.. rubric:: Footnotes
618
619.. [#] This approach has been first presented in `a discussion on xmlrpc.com
Serhiy Storchakab4905ef2016-05-07 10:50:12 +0300620 <https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic>`_.
Sandro Tosi9b680922011-08-20 17:05:15 +0200621.. the link now points to webarchive since the one at
622.. http://www.xmlrpc.com/discuss/msgReader%241208 is broken (and webadmin
623.. doesn't reply)