blob: e199931b55bd6f993aef1f9b93d2714b51c124b1 [file] [log] [blame]
Georg Brandl38eceaa2008-05-26 11:14:17 +00001:mod:`xmlrpc.client` --- XML-RPC client access
2==============================================
Georg Brandl116aa622007-08-15 14:28:22 +00003
Georg Brandl38eceaa2008-05-26 11:14:17 +00004.. module:: xmlrpc.client
Georg Brandl116aa622007-08-15 14:28:22 +00005 :synopsis: XML-RPC client access.
6.. moduleauthor:: Fredrik Lundh <fredrik@pythonware.com>
7.. sectionauthor:: Eric S. Raymond <esr@snark.thyrsus.com>
8
9
Christian Heimes5b5e81c2007-12-31 16:14:33 +000010.. XXX Not everything is documented yet. It might be good to describe
Florent Xicluna61665192011-11-15 20:53:25 +010011 Marshaller, Unmarshaller, getparser and Transport.
Georg Brandl116aa622007-08-15 14:28:22 +000012
Raymond Hettinger3029aff2011-02-10 08:09:36 +000013**Source code:** :source:`Lib/xmlrpc/client.py`
14
15--------------
16
Georg Brandl116aa622007-08-15 14:28:22 +000017XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a
18transport. With it, a client can call methods with parameters on a remote
19server (the server is named by a URI) and get back structured data. This module
20supports writing XML-RPC client code; it handles all the details of translating
21between conformable Python objects and XML on the wire.
22
23
Christian Heimes7380a672013-03-26 17:35:55 +010024.. warning::
25
26 The :mod:`xmlrpc.client` module is not secure against maliciously
27 constructed data. If you need to parse untrusted or unauthenticated data see
28 :ref:`xml-vulnerabilities`.
29
Benjamin Petersone39bba22014-11-29 23:34:30 -050030.. versionchanged:: 3.5
Benjamin Peterson77a75b32014-10-13 11:54:50 -040031
Benjamin Peterson4ffb0752014-11-03 14:29:33 -050032 For https URIs, :mod:`xmlrpc.client` now performs all the necessary
33 certificate and hostname checks by default
Christian Heimes7380a672013-03-26 17:35:55 +010034
Florent Xicluna61665192011-11-15 20:53:25 +010035.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, \
36 allow_none=False, use_datetime=False, \
Benjamin Petersonb7138e22014-11-29 23:38:17 -050037 use_builtin_types=False, *, context=None)
Florent Xicluna61665192011-11-15 20:53:25 +010038
39 .. versionchanged:: 3.3
40 The *use_builtin_types* flag was added.
Georg Brandl116aa622007-08-15 14:28:22 +000041
42 A :class:`ServerProxy` instance is an object that manages communication with a
43 remote XML-RPC server. The required first argument is a URI (Uniform Resource
44 Indicator), and will normally be the URL of the server. The optional second
45 argument is a transport factory instance; by default it is an internal
46 :class:`SafeTransport` instance for https: URLs and an internal HTTP
47 :class:`Transport` instance otherwise. The optional third argument is an
48 encoding, by default UTF-8. The optional fourth argument is a debugging flag.
49 If *allow_none* is true, the Python constant ``None`` will be translated into
50 XML; the default behaviour is for ``None`` to raise a :exc:`TypeError`. This is
51 a commonly-used extension to the XML-RPC specification, but isn't supported by
52 all clients and servers; see http://ontosys.com/xml-rpc/extensions.php for a
Florent Xicluna61665192011-11-15 20:53:25 +010053 description. The *use_builtin_types* flag can be used to cause date/time values
54 to be presented as :class:`datetime.datetime` objects and binary data to be
55 presented as :class:`bytes` objects; this flag is false by default.
56 :class:`datetime.datetime` and :class:`bytes` objects may be passed to calls.
57
58 The obsolete *use_datetime* flag is similar to *use_builtin_types* but it
59 applies only to date/time values.
Georg Brandl116aa622007-08-15 14:28:22 +000060
61 Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
62 Basic Authentication: ``http://user:pass@host:port/path``. The ``user:pass``
63 portion will be base64-encoded as an HTTP 'Authorization' header, and sent to
64 the remote server as part of the connection process when invoking an XML-RPC
65 method. You only need to use this if the remote server requires a Basic
Benjamin Petersonc1da3d12014-11-29 23:32:57 -050066 Authentication user and password. If an HTTPS url is provided, *context* may
67 be :class:`ssl.SSLContext` and configures the SSL settings of the underlying
68 HTTPS connection.
Georg Brandl116aa622007-08-15 14:28:22 +000069
70 The returned instance is a proxy object with methods that can be used to invoke
71 corresponding RPC calls on the remote server. If the remote server supports the
72 introspection API, the proxy can also be used to query the remote server for the
73 methods it supports (service discovery) and fetch other server-associated
74 metadata.
75
76 :class:`ServerProxy` instance methods take Python basic types and objects as
77 arguments and return Python basic types and classes. Types that are conformable
78 (e.g. that can be marshalled through XML), include the following (and except
79 where noted, they are unmarshalled as the same Python type):
80
Georg Brandl44ea77b2013-03-28 13:28:44 +010081 .. tabularcolumns:: |l|L|
82
Georg Brandl116aa622007-08-15 14:28:22 +000083 +---------------------------------+---------------------------------------------+
84 | Name | Meaning |
85 +=================================+=============================================+
86 | :const:`boolean` | The :const:`True` and :const:`False` |
87 | | constants |
88 +---------------------------------+---------------------------------------------+
89 | :const:`integers` | Pass in directly |
90 +---------------------------------+---------------------------------------------+
91 | :const:`floating-point numbers` | Pass in directly |
92 +---------------------------------+---------------------------------------------+
93 | :const:`strings` | Pass in directly |
94 +---------------------------------+---------------------------------------------+
95 | :const:`arrays` | Any Python sequence type containing |
96 | | conformable elements. Arrays are returned |
97 | | as lists |
98 +---------------------------------+---------------------------------------------+
99 | :const:`structures` | A Python dictionary. Keys must be strings, |
100 | | values may be any conformable type. Objects |
101 | | of user-defined classes can be passed in; |
102 | | only their *__dict__* attribute is |
103 | | transmitted. |
104 +---------------------------------+---------------------------------------------+
Florent Xicluna61665192011-11-15 20:53:25 +0100105 | :const:`dates` | In seconds since the epoch. Pass in an |
106 | | instance of the :class:`DateTime` class or |
Christian Heimes05e8be12008-02-23 18:30:17 +0000107 | | a :class:`datetime.datetime` instance. |
Georg Brandl116aa622007-08-15 14:28:22 +0000108 +---------------------------------+---------------------------------------------+
Florent Xicluna61665192011-11-15 20:53:25 +0100109 | :const:`binary data` | Pass in an instance of the :class:`Binary` |
110 | | wrapper class or a :class:`bytes` instance. |
Georg Brandl116aa622007-08-15 14:28:22 +0000111 +---------------------------------+---------------------------------------------+
112
113 This is the full set of data types supported by XML-RPC. Method calls may also
114 raise a special :exc:`Fault` instance, used to signal XML-RPC server errors, or
115 :exc:`ProtocolError` used to signal an error in the HTTP/HTTPS transport layer.
116 Both :exc:`Fault` and :exc:`ProtocolError` derive from a base class called
Georg Brandl38eceaa2008-05-26 11:14:17 +0000117 :exc:`Error`. Note that the xmlrpc client module currently does not marshal
Georg Brandl22b34312009-07-26 14:54:51 +0000118 instances of subclasses of built-in types.
Georg Brandl116aa622007-08-15 14:28:22 +0000119
120 When passing strings, characters special to XML such as ``<``, ``>``, and ``&``
121 will be automatically escaped. However, it's the caller's responsibility to
122 ensure that the string is free of characters that aren't allowed in XML, such as
123 the control characters with ASCII values between 0 and 31 (except, of course,
124 tab, newline and carriage return); failing to do this will result in an XML-RPC
Florent Xicluna61665192011-11-15 20:53:25 +0100125 request that isn't well-formed XML. If you have to pass arbitrary bytes
126 via XML-RPC, use the :class:`bytes` class or the class:`Binary` wrapper class
127 described below.
Georg Brandl116aa622007-08-15 14:28:22 +0000128
129 :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
130 compatibility. New code should use :class:`ServerProxy`.
131
Benjamin Petersone39bba22014-11-29 23:34:30 -0500132 .. versionchanged:: 3.5
Benjamin Petersonc1da3d12014-11-29 23:32:57 -0500133 Added the *context* argument.
134
Georg Brandl116aa622007-08-15 14:28:22 +0000135
136.. seealso::
137
138 `XML-RPC HOWTO <http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html>`_
Christian Heimesa62da1d2008-01-12 19:39:10 +0000139 A good description of XML-RPC operation and client software in several languages.
Georg Brandl116aa622007-08-15 14:28:22 +0000140 Contains pretty much everything an XML-RPC client developer needs to know.
141
Christian Heimesa62da1d2008-01-12 19:39:10 +0000142 `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
143 Describes the XML-RPC protocol extension for introspection.
Georg Brandl116aa622007-08-15 14:28:22 +0000144
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000145 `XML-RPC Specification <http://www.xmlrpc.com/spec>`_
146 The official specification.
147
148 `Unofficial XML-RPC Errata <http://effbot.org/zone/xmlrpc-errata.htm>`_
149 Fredrik Lundh's "unofficial errata, intended to clarify certain
150 details in the XML-RPC specification, as well as hint at
151 'best practices' to use when designing your own XML-RPC
152 implementations."
Georg Brandl116aa622007-08-15 14:28:22 +0000153
154.. _serverproxy-objects:
155
156ServerProxy Objects
157-------------------
158
159A :class:`ServerProxy` instance has a method corresponding to each remote
160procedure call accepted by the XML-RPC server. Calling the method performs an
161RPC, dispatched by both name and argument signature (e.g. the same method name
162can be overloaded with multiple argument signatures). The RPC finishes by
163returning a value, which may be either returned data in a conformant type or a
164:class:`Fault` or :class:`ProtocolError` object indicating an error.
165
166Servers that support the XML introspection API support some common methods
Senthil Kumarana6bac952011-07-04 11:28:30 -0700167grouped under the reserved :attr:`system` attribute:
Georg Brandl116aa622007-08-15 14:28:22 +0000168
169
170.. method:: ServerProxy.system.listMethods()
171
172 This method returns a list of strings, one for each (non-system) method
173 supported by the XML-RPC server.
174
175
176.. method:: ServerProxy.system.methodSignature(name)
177
178 This method takes one parameter, the name of a method implemented by the XML-RPC
Georg Brandl94606482009-05-04 20:46:44 +0000179 server. It returns an array of possible signatures for this method. A signature
Georg Brandl116aa622007-08-15 14:28:22 +0000180 is an array of types. The first of these types is the return type of the method,
181 the rest are parameters.
182
183 Because multiple signatures (ie. overloading) is permitted, this method returns
184 a list of signatures rather than a singleton.
185
186 Signatures themselves are restricted to the top level parameters expected by a
187 method. For instance if a method expects one array of structs as a parameter,
188 and it returns a string, its signature is simply "string, array". If it expects
189 three integers and returns a string, its signature is "string, int, int, int".
190
191 If no signature is defined for the method, a non-array value is returned. In
192 Python this means that the type of the returned value will be something other
Georg Brandl94606482009-05-04 20:46:44 +0000193 than list.
Georg Brandl116aa622007-08-15 14:28:22 +0000194
195
196.. method:: ServerProxy.system.methodHelp(name)
197
198 This method takes one parameter, the name of a method implemented by the XML-RPC
199 server. It returns a documentation string describing the use of that method. If
200 no such string is available, an empty string is returned. The documentation
201 string may contain HTML markup.
202
Brett Cannon33a40002014-03-21 11:24:40 -0400203.. versionchanged:: 3.5
204
205 Instances of :class:`ServerProxy` support the :term:`context manager` protocol
206 for closing the underlying transport.
207
Georg Brandl116aa622007-08-15 14:28:22 +0000208
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000209A working example follows. The server code::
210
Georg Brandl38eceaa2008-05-26 11:14:17 +0000211 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000212
213 def is_even(n):
214 return n%2 == 0
215
216 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000217 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000218 server.register_function(is_even, "is_even")
219 server.serve_forever()
220
221The client code for the preceding server::
222
Georg Brandl38eceaa2008-05-26 11:14:17 +0000223 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000224
Brett Cannon33a40002014-03-21 11:24:40 -0400225 with xmlrpc.client.ServerProxy("http://localhost:8000/") as proxy:
226 print("3 is even: %s" % str(proxy.is_even(3)))
227 print("100 is even: %s" % str(proxy.is_even(100)))
Georg Brandl116aa622007-08-15 14:28:22 +0000228
229.. _datetime-objects:
230
231DateTime Objects
232----------------
233
Christian Heimes05e8be12008-02-23 18:30:17 +0000234This class may be initialized with seconds since the epoch, a time
235tuple, an ISO 8601 time/date string, or a :class:`datetime.datetime`
236instance. It has the following methods, supported mainly for internal
237use by the marshalling/unmarshalling code:
Georg Brandl116aa622007-08-15 14:28:22 +0000238
239
240.. method:: DateTime.decode(string)
241
242 Accept a string as the instance's new time value.
243
244
245.. method:: DateTime.encode(out)
246
247 Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream
248 object.
249
Georg Brandl05f5ab72008-09-24 09:11:47 +0000250It also supports certain of Python's built-in operators through rich comparison
Georg Brandl116aa622007-08-15 14:28:22 +0000251and :meth:`__repr__` methods.
252
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000253A working example follows. The server code::
254
255 import datetime
Georg Brandl38eceaa2008-05-26 11:14:17 +0000256 from xmlrpc.server import SimpleXMLRPCServer
257 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000258
259 def today():
260 today = datetime.datetime.today()
Georg Brandl38eceaa2008-05-26 11:14:17 +0000261 return xmlrpc.client.DateTime(today)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000262
263 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000264 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000265 server.register_function(today, "today")
266 server.serve_forever()
267
268The client code for the preceding server::
269
Georg Brandl38eceaa2008-05-26 11:14:17 +0000270 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000271 import datetime
272
Georg Brandl38eceaa2008-05-26 11:14:17 +0000273 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000274
275 today = proxy.today()
276 # convert the ISO8601 string to a datetime object
277 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
Georg Brandlf6945182008-02-01 11:56:49 +0000278 print("Today: %s" % converted.strftime("%d.%m.%Y, %H:%M"))
Georg Brandl116aa622007-08-15 14:28:22 +0000279
280.. _binary-objects:
281
282Binary Objects
283--------------
284
Florent Xicluna61665192011-11-15 20:53:25 +0100285This class may be initialized from bytes data (which may include NULs). The
Georg Brandl116aa622007-08-15 14:28:22 +0000286primary access to the content of a :class:`Binary` object is provided by an
287attribute:
288
289
290.. attribute:: Binary.data
291
292 The binary data encapsulated by the :class:`Binary` instance. The data is
Florent Xicluna61665192011-11-15 20:53:25 +0100293 provided as a :class:`bytes` object.
Georg Brandl116aa622007-08-15 14:28:22 +0000294
295:class:`Binary` objects have the following methods, supported mainly for
296internal use by the marshalling/unmarshalling code:
297
298
Florent Xicluna61665192011-11-15 20:53:25 +0100299.. method:: Binary.decode(bytes)
Georg Brandl116aa622007-08-15 14:28:22 +0000300
Florent Xicluna61665192011-11-15 20:53:25 +0100301 Accept a base64 :class:`bytes` object and decode it as the instance's new data.
Georg Brandl116aa622007-08-15 14:28:22 +0000302
303
304.. method:: Binary.encode(out)
305
306 Write the XML-RPC base 64 encoding of this binary item to the out stream object.
307
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000308 The encoded data will have newlines every 76 characters as per
309 `RFC 2045 section 6.8 <http://tools.ietf.org/html/rfc2045#section-6.8>`_,
310 which was the de facto standard base64 specification when the
311 XML-RPC spec was written.
312
Georg Brandl05f5ab72008-09-24 09:11:47 +0000313It also supports certain of Python's built-in operators through :meth:`__eq__`
314and :meth:`__ne__` methods.
Georg Brandl116aa622007-08-15 14:28:22 +0000315
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000316Example usage of the binary objects. We're going to transfer an image over
317XMLRPC::
318
Georg Brandl38eceaa2008-05-26 11:14:17 +0000319 from xmlrpc.server import SimpleXMLRPCServer
320 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000321
322 def python_logo():
Victor Stinner757db832010-01-30 02:16:55 +0000323 with open("python_logo.jpg", "rb") as handle:
324 return xmlrpc.client.Binary(handle.read())
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000325
326 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000327 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000328 server.register_function(python_logo, 'python_logo')
329
330 server.serve_forever()
331
332The client gets the image and saves it to a file::
333
Georg Brandl38eceaa2008-05-26 11:14:17 +0000334 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000335
Georg Brandl38eceaa2008-05-26 11:14:17 +0000336 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Victor Stinner757db832010-01-30 02:16:55 +0000337 with open("fetched_python_logo.jpg", "wb") as handle:
338 handle.write(proxy.python_logo().data)
Georg Brandl116aa622007-08-15 14:28:22 +0000339
340.. _fault-objects:
341
342Fault Objects
343-------------
344
345A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault
Senthil Kumarana6bac952011-07-04 11:28:30 -0700346objects have the following attributes:
Georg Brandl116aa622007-08-15 14:28:22 +0000347
348
349.. attribute:: Fault.faultCode
350
351 A string indicating the fault type.
352
353
354.. attribute:: Fault.faultString
355
356 A string containing a diagnostic message associated with the fault.
357
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000358In the following example we're going to intentionally cause a :exc:`Fault` by
359returning a complex type object. The server code::
360
Georg Brandl38eceaa2008-05-26 11:14:17 +0000361 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000362
363 # A marshalling error is going to occur because we're returning a
364 # complex number
365 def add(x,y):
366 return x+y+0j
367
368 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000369 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000370 server.register_function(add, 'add')
371
372 server.serve_forever()
373
374The client code for the preceding server::
375
Georg Brandl38eceaa2008-05-26 11:14:17 +0000376 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000377
Georg Brandl38eceaa2008-05-26 11:14:17 +0000378 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000379 try:
380 proxy.add(2, 5)
Georg Brandl0dedf452009-05-22 16:44:06 +0000381 except xmlrpc.client.Fault as err:
Georg Brandl2ee470f2008-07-16 12:55:28 +0000382 print("A fault occurred")
Georg Brandlf6945182008-02-01 11:56:49 +0000383 print("Fault code: %d" % err.faultCode)
384 print("Fault string: %s" % err.faultString)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000385
386
Georg Brandl116aa622007-08-15 14:28:22 +0000387
388.. _protocol-error-objects:
389
390ProtocolError Objects
391---------------------
392
393A :class:`ProtocolError` object describes a protocol error in the underlying
394transport layer (such as a 404 'not found' error if the server named by the URI
Senthil Kumarana6bac952011-07-04 11:28:30 -0700395does not exist). It has the following attributes:
Georg Brandl116aa622007-08-15 14:28:22 +0000396
397
398.. attribute:: ProtocolError.url
399
400 The URI or URL that triggered the error.
401
402
403.. attribute:: ProtocolError.errcode
404
405 The error code.
406
407
408.. attribute:: ProtocolError.errmsg
409
410 The error message or diagnostic string.
411
412
413.. attribute:: ProtocolError.headers
414
Guido van Rossum460add42007-08-23 02:13:35 +0000415 A dict containing the headers of the HTTP/HTTPS request that triggered the
Georg Brandl116aa622007-08-15 14:28:22 +0000416 error.
417
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000418In the following example we're going to intentionally cause a :exc:`ProtocolError`
419by providing an invalid URI::
420
Georg Brandl38eceaa2008-05-26 11:14:17 +0000421 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000422
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +0000423 # create a ServerProxy with an URI that doesn't respond to XMLRPC requests
424 proxy = xmlrpc.client.ServerProxy("http://google.com/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000425
426 try:
427 proxy.some_method()
Georg Brandl0dedf452009-05-22 16:44:06 +0000428 except xmlrpc.client.ProtocolError as err:
Georg Brandl2ee470f2008-07-16 12:55:28 +0000429 print("A protocol error occurred")
Georg Brandlf6945182008-02-01 11:56:49 +0000430 print("URL: %s" % err.url)
431 print("HTTP/HTTPS headers: %s" % err.headers)
432 print("Error code: %d" % err.errcode)
433 print("Error message: %s" % err.errmsg)
Georg Brandl116aa622007-08-15 14:28:22 +0000434
435MultiCall Objects
436-----------------
437
Sandro Tosi9daf98d2011-08-20 17:05:56 +0200438The :class:`MultiCall` object provides a way to encapsulate multiple calls to a
439remote server into a single request [#]_.
Georg Brandl116aa622007-08-15 14:28:22 +0000440
441
442.. class:: MultiCall(server)
443
444 Create an object used to boxcar method calls. *server* is the eventual target of
445 the call. Calls can be made to the result object, but they will immediately
446 return ``None``, and only store the call name and parameters in the
447 :class:`MultiCall` object. Calling the object itself causes all stored calls to
448 be transmitted as a single ``system.multicall`` request. The result of this call
Georg Brandl9afde1c2007-11-01 20:32:30 +0000449 is a :term:`generator`; iterating over this generator yields the individual
450 results.
Georg Brandl116aa622007-08-15 14:28:22 +0000451
Andrew Kuchlingc3db3732013-06-20 21:33:05 -0400452A usage example of this class follows. The server code::
Georg Brandl116aa622007-08-15 14:28:22 +0000453
Georg Brandl38eceaa2008-05-26 11:14:17 +0000454 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000455
Ezio Melotti79016e12013-08-08 15:45:56 +0300456 def add(x, y):
457 return x + y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000458
459 def subtract(x, y):
Ezio Melotti79016e12013-08-08 15:45:56 +0300460 return x - y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000461
462 def multiply(x, y):
Ezio Melotti79016e12013-08-08 15:45:56 +0300463 return x * y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000464
465 def divide(x, y):
Andrew Kuchlingc3db3732013-06-20 21:33:05 -0400466 return x // y
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000467
468 # A simple server with simple arithmetic functions
469 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000470 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000471 server.register_multicall_functions()
472 server.register_function(add, 'add')
473 server.register_function(subtract, 'subtract')
474 server.register_function(multiply, 'multiply')
475 server.register_function(divide, 'divide')
476 server.serve_forever()
477
478The client code for the preceding server::
479
Georg Brandl38eceaa2008-05-26 11:14:17 +0000480 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000481
Georg Brandl38eceaa2008-05-26 11:14:17 +0000482 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
483 multicall = xmlrpc.client.MultiCall(proxy)
Ezio Melotti79016e12013-08-08 15:45:56 +0300484 multicall.add(7, 3)
485 multicall.subtract(7, 3)
486 multicall.multiply(7, 3)
487 multicall.divide(7, 3)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000488 result = multicall()
489
Ezio Melotti79016e12013-08-08 15:45:56 +0300490 print("7+3=%d, 7-3=%d, 7*3=%d, 7//3=%d" % tuple(result))
Georg Brandl116aa622007-08-15 14:28:22 +0000491
492
493Convenience Functions
494---------------------
495
Georg Brandl7f01a132009-09-16 15:58:14 +0000496.. function:: dumps(params, methodname=None, methodresponse=None, encoding=None, allow_none=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000497
498 Convert *params* into an XML-RPC request. or into a response if *methodresponse*
499 is true. *params* can be either a tuple of arguments or an instance of the
500 :exc:`Fault` exception class. If *methodresponse* is true, only a single value
501 can be returned, meaning that *params* must be of length 1. *encoding*, if
502 supplied, is the encoding to use in the generated XML; the default is UTF-8.
503 Python's :const:`None` value cannot be used in standard XML-RPC; to allow using
504 it via an extension, provide a true value for *allow_none*.
505
506
Florent Xicluna61665192011-11-15 20:53:25 +0100507.. function:: loads(data, use_datetime=False, use_builtin_types=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000508
509 Convert an XML-RPC request or response into Python objects, a ``(params,
510 methodname)``. *params* is a tuple of argument; *methodname* is a string, or
511 ``None`` if no method name is present in the packet. If the XML-RPC packet
512 represents a fault condition, this function will raise a :exc:`Fault` exception.
Florent Xicluna61665192011-11-15 20:53:25 +0100513 The *use_builtin_types* flag can be used to cause date/time values to be
514 presented as :class:`datetime.datetime` objects and binary data to be
515 presented as :class:`bytes` objects; this flag is false by default.
516
517 The obsolete *use_datetime* flag is similar to *use_builtin_types* but it
518 applies only to date/time values.
519
520 .. versionchanged:: 3.3
521 The *use_builtin_types* flag was added.
Georg Brandl116aa622007-08-15 14:28:22 +0000522
Georg Brandl116aa622007-08-15 14:28:22 +0000523
524.. _xmlrpc-client-example:
525
526Example of Client Usage
527-----------------------
528
529::
530
531 # simple test program (from the XML-RPC specification)
Georg Brandl38eceaa2008-05-26 11:14:17 +0000532 from xmlrpc.client import ServerProxy, Error
Georg Brandl116aa622007-08-15 14:28:22 +0000533
534 # server = ServerProxy("http://localhost:8000") # local server
Brett Cannon33a40002014-03-21 11:24:40 -0400535 with ServerProxy("http://betty.userland.com") as proxy:
Georg Brandl116aa622007-08-15 14:28:22 +0000536
Brett Cannon33a40002014-03-21 11:24:40 -0400537 print(proxy)
Georg Brandl116aa622007-08-15 14:28:22 +0000538
Brett Cannon33a40002014-03-21 11:24:40 -0400539 try:
540 print(proxy.examples.getStateName(41))
541 except Error as v:
542 print("ERROR", v)
Georg Brandl116aa622007-08-15 14:28:22 +0000543
544To access an XML-RPC server through a proxy, you need to define a custom
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000545transport. The following example shows how:
Georg Brandl116aa622007-08-15 14:28:22 +0000546
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000547.. Example taken from http://lowlife.jp/nobonobo/wiki/xmlrpcwithproxy.html
Georg Brandl116aa622007-08-15 14:28:22 +0000548
549::
550
Georg Brandl24420152008-05-26 16:32:26 +0000551 import xmlrpc.client, http.client
Georg Brandl116aa622007-08-15 14:28:22 +0000552
Georg Brandl38eceaa2008-05-26 11:14:17 +0000553 class ProxiedTransport(xmlrpc.client.Transport):
Georg Brandl116aa622007-08-15 14:28:22 +0000554 def set_proxy(self, proxy):
555 self.proxy = proxy
556 def make_connection(self, host):
557 self.realhost = host
Georg Brandl06788c92009-01-03 21:31:47 +0000558 h = http.client.HTTP(self.proxy)
559 return h
Georg Brandl116aa622007-08-15 14:28:22 +0000560 def send_request(self, connection, handler, request_body):
561 connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
562 def send_host(self, connection, host):
563 connection.putheader('Host', self.realhost)
564
565 p = ProxiedTransport()
566 p.set_proxy('proxy-server:8080')
Georg Brandl38eceaa2008-05-26 11:14:17 +0000567 server = xmlrpc.client.Server('http://time.xmlrpc.com/RPC2', transport=p)
Collin Winterc79461b2007-09-01 23:34:30 +0000568 print(server.currentTime.getCurrentTime())
Georg Brandl116aa622007-08-15 14:28:22 +0000569
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000570
571Example of Client and Server Usage
572----------------------------------
573
574See :ref:`simplexmlrpcserver-example`.
575
576
Sandro Tosi9daf98d2011-08-20 17:05:56 +0200577.. rubric:: Footnotes
578
579.. [#] This approach has been first presented in `a discussion on xmlrpc.com
580 <http://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic>`_.
581.. the link now points to webarchive since the one at
582.. http://www.xmlrpc.com/discuss/msgReader%241208 is broken (and webadmin
583.. doesn't reply)