blob: dd6a0ccf82dcd784bf4772a5a38db76f8ad3c2c2 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +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
9
Christian Heimes5b5e81c2007-12-31 16:14:33 +000010.. XXX Not everything is documented yet. It might be good to describe
11 Marshaller, Unmarshaller, getparser, dumps, loads, and Transport.
Georg Brandl116aa622007-08-15 14:28:22 +000012
Georg Brandl116aa622007-08-15 14:28:22 +000013XML-RPC is a Remote Procedure Call method that uses XML passed via HTTP as a
14transport. With it, a client can call methods with parameters on a remote
15server (the server is named by a URI) and get back structured data. This module
16supports writing XML-RPC client code; it handles all the details of translating
17between conformable Python objects and XML on the wire.
18
19
20.. class:: ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime]]]]])
21
22 A :class:`ServerProxy` instance is an object that manages communication with a
23 remote XML-RPC server. The required first argument is a URI (Uniform Resource
24 Indicator), and will normally be the URL of the server. The optional second
25 argument is a transport factory instance; by default it is an internal
26 :class:`SafeTransport` instance for https: URLs and an internal HTTP
27 :class:`Transport` instance otherwise. The optional third argument is an
28 encoding, by default UTF-8. The optional fourth argument is a debugging flag.
29 If *allow_none* is true, the Python constant ``None`` will be translated into
30 XML; the default behaviour is for ``None`` to raise a :exc:`TypeError`. This is
31 a commonly-used extension to the XML-RPC specification, but isn't supported by
32 all clients and servers; see http://ontosys.com/xml-rpc/extensions.php for a
33 description. The *use_datetime* flag can be used to cause date/time values to
34 be presented as :class:`datetime.datetime` objects; this is false by default.
Christian Heimes05e8be12008-02-23 18:30:17 +000035 :class:`datetime.datetime` objects may be passed to calls.
Georg Brandl116aa622007-08-15 14:28:22 +000036
37 Both the HTTP and HTTPS transports support the URL syntax extension for HTTP
38 Basic Authentication: ``http://user:pass@host:port/path``. The ``user:pass``
39 portion will be base64-encoded as an HTTP 'Authorization' header, and sent to
40 the remote server as part of the connection process when invoking an XML-RPC
41 method. You only need to use this if the remote server requires a Basic
42 Authentication user and password.
43
44 The returned instance is a proxy object with methods that can be used to invoke
45 corresponding RPC calls on the remote server. If the remote server supports the
46 introspection API, the proxy can also be used to query the remote server for the
47 methods it supports (service discovery) and fetch other server-associated
48 metadata.
49
50 :class:`ServerProxy` instance methods take Python basic types and objects as
51 arguments and return Python basic types and classes. Types that are conformable
52 (e.g. that can be marshalled through XML), include the following (and except
53 where noted, they are unmarshalled as the same Python type):
54
55 +---------------------------------+---------------------------------------------+
56 | Name | Meaning |
57 +=================================+=============================================+
58 | :const:`boolean` | The :const:`True` and :const:`False` |
59 | | constants |
60 +---------------------------------+---------------------------------------------+
61 | :const:`integers` | Pass in directly |
62 +---------------------------------+---------------------------------------------+
63 | :const:`floating-point numbers` | Pass in directly |
64 +---------------------------------+---------------------------------------------+
65 | :const:`strings` | Pass in directly |
66 +---------------------------------+---------------------------------------------+
67 | :const:`arrays` | Any Python sequence type containing |
68 | | conformable elements. Arrays are returned |
69 | | as lists |
70 +---------------------------------+---------------------------------------------+
71 | :const:`structures` | A Python dictionary. Keys must be strings, |
72 | | values may be any conformable type. Objects |
73 | | of user-defined classes can be passed in; |
74 | | only their *__dict__* attribute is |
75 | | transmitted. |
76 +---------------------------------+---------------------------------------------+
77 | :const:`dates` | in seconds since the epoch (pass in an |
78 | | instance of the :class:`DateTime` class) or |
Christian Heimes05e8be12008-02-23 18:30:17 +000079 | | a :class:`datetime.datetime` instance. |
Georg Brandl116aa622007-08-15 14:28:22 +000080 +---------------------------------+---------------------------------------------+
81 | :const:`binary data` | pass in an instance of the :class:`Binary` |
82 | | wrapper class |
83 +---------------------------------+---------------------------------------------+
84
85 This is the full set of data types supported by XML-RPC. Method calls may also
86 raise a special :exc:`Fault` instance, used to signal XML-RPC server errors, or
87 :exc:`ProtocolError` used to signal an error in the HTTP/HTTPS transport layer.
88 Both :exc:`Fault` and :exc:`ProtocolError` derive from a base class called
89 :exc:`Error`. Note that even though starting with Python 2.2 you can subclass
90 builtin types, the xmlrpclib module currently does not marshal instances of such
91 subclasses.
92
93 When passing strings, characters special to XML such as ``<``, ``>``, and ``&``
94 will be automatically escaped. However, it's the caller's responsibility to
95 ensure that the string is free of characters that aren't allowed in XML, such as
96 the control characters with ASCII values between 0 and 31 (except, of course,
97 tab, newline and carriage return); failing to do this will result in an XML-RPC
98 request that isn't well-formed XML. If you have to pass arbitrary strings via
99 XML-RPC, use the :class:`Binary` wrapper class described below.
100
101 :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
102 compatibility. New code should use :class:`ServerProxy`.
103
Georg Brandl116aa622007-08-15 14:28:22 +0000104
105.. seealso::
106
107 `XML-RPC HOWTO <http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html>`_
Christian Heimesa62da1d2008-01-12 19:39:10 +0000108 A good description of XML-RPC operation and client software in several languages.
Georg Brandl116aa622007-08-15 14:28:22 +0000109 Contains pretty much everything an XML-RPC client developer needs to know.
110
Christian Heimesa62da1d2008-01-12 19:39:10 +0000111 `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
112 Describes the XML-RPC protocol extension for introspection.
Georg Brandl116aa622007-08-15 14:28:22 +0000113
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000114 `XML-RPC Specification <http://www.xmlrpc.com/spec>`_
115 The official specification.
116
117 `Unofficial XML-RPC Errata <http://effbot.org/zone/xmlrpc-errata.htm>`_
118 Fredrik Lundh's "unofficial errata, intended to clarify certain
119 details in the XML-RPC specification, as well as hint at
120 'best practices' to use when designing your own XML-RPC
121 implementations."
Georg Brandl116aa622007-08-15 14:28:22 +0000122
123.. _serverproxy-objects:
124
125ServerProxy Objects
126-------------------
127
128A :class:`ServerProxy` instance has a method corresponding to each remote
129procedure call accepted by the XML-RPC server. Calling the method performs an
130RPC, dispatched by both name and argument signature (e.g. the same method name
131can be overloaded with multiple argument signatures). The RPC finishes by
132returning a value, which may be either returned data in a conformant type or a
133:class:`Fault` or :class:`ProtocolError` object indicating an error.
134
135Servers that support the XML introspection API support some common methods
136grouped under the reserved :attr:`system` member:
137
138
139.. method:: ServerProxy.system.listMethods()
140
141 This method returns a list of strings, one for each (non-system) method
142 supported by the XML-RPC server.
143
144
145.. method:: ServerProxy.system.methodSignature(name)
146
147 This method takes one parameter, the name of a method implemented by the XML-RPC
148 server.It returns an array of possible signatures for this method. A signature
149 is an array of types. The first of these types is the return type of the method,
150 the rest are parameters.
151
152 Because multiple signatures (ie. overloading) is permitted, this method returns
153 a list of signatures rather than a singleton.
154
155 Signatures themselves are restricted to the top level parameters expected by a
156 method. For instance if a method expects one array of structs as a parameter,
157 and it returns a string, its signature is simply "string, array". If it expects
158 three integers and returns a string, its signature is "string, int, int, int".
159
160 If no signature is defined for the method, a non-array value is returned. In
161 Python this means that the type of the returned value will be something other
162 that list.
163
164
165.. method:: ServerProxy.system.methodHelp(name)
166
167 This method takes one parameter, the name of a method implemented by the XML-RPC
168 server. It returns a documentation string describing the use of that method. If
169 no such string is available, an empty string is returned. The documentation
170 string may contain HTML markup.
171
Georg Brandl116aa622007-08-15 14:28:22 +0000172
173.. _boolean-objects:
174
175Boolean Objects
176---------------
177
178This class may be initialized from any Python value; the instance returned
179depends only on its truth value. It supports various Python operators through
180:meth:`__cmp__`, :meth:`__repr__`, :meth:`__int__`, and :meth:`__bool__`
181methods, all implemented in the obvious ways.
182
183It also has the following method, supported mainly for internal use by the
184unmarshalling code:
185
186
187.. method:: Boolean.encode(out)
188
189 Write the XML-RPC encoding of this Boolean item to the out stream object.
190
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000191A working example follows. The server code::
192
193 import xmlrpclib
194 from SimpleXMLRPCServer import SimpleXMLRPCServer
195
196 def is_even(n):
197 return n%2 == 0
198
199 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000200 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000201 server.register_function(is_even, "is_even")
202 server.serve_forever()
203
204The client code for the preceding server::
205
206 import xmlrpclib
207
208 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
Georg Brandlf6945182008-02-01 11:56:49 +0000209 print("3 is even: %s" % str(proxy.is_even(3)))
210 print("100 is even: %s" % str(proxy.is_even(100)))
Georg Brandl116aa622007-08-15 14:28:22 +0000211
212.. _datetime-objects:
213
214DateTime Objects
215----------------
216
Christian Heimes05e8be12008-02-23 18:30:17 +0000217This class may be initialized with seconds since the epoch, a time
218tuple, an ISO 8601 time/date string, or a :class:`datetime.datetime`
219instance. It has the following methods, supported mainly for internal
220use by the marshalling/unmarshalling code:
Georg Brandl116aa622007-08-15 14:28:22 +0000221
222
223.. method:: DateTime.decode(string)
224
225 Accept a string as the instance's new time value.
226
227
228.. method:: DateTime.encode(out)
229
230 Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream
231 object.
232
233It also supports certain of Python's built-in operators through :meth:`__cmp__`
234and :meth:`__repr__` methods.
235
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000236A working example follows. The server code::
237
238 import datetime
239 from SimpleXMLRPCServer import SimpleXMLRPCServer
240 import xmlrpclib
241
242 def today():
243 today = datetime.datetime.today()
244 return xmlrpclib.DateTime(today)
245
246 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000247 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000248 server.register_function(today, "today")
249 server.serve_forever()
250
251The client code for the preceding server::
252
253 import xmlrpclib
254 import datetime
255
256 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
257
258 today = proxy.today()
259 # convert the ISO8601 string to a datetime object
260 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
Georg Brandlf6945182008-02-01 11:56:49 +0000261 print("Today: %s" % converted.strftime("%d.%m.%Y, %H:%M"))
Georg Brandl116aa622007-08-15 14:28:22 +0000262
263.. _binary-objects:
264
265Binary Objects
266--------------
267
268This class may be initialized from string data (which may include NULs). The
269primary access to the content of a :class:`Binary` object is provided by an
270attribute:
271
272
273.. attribute:: Binary.data
274
275 The binary data encapsulated by the :class:`Binary` instance. The data is
276 provided as an 8-bit string.
277
278:class:`Binary` objects have the following methods, supported mainly for
279internal use by the marshalling/unmarshalling code:
280
281
282.. method:: Binary.decode(string)
283
284 Accept a base64 string and decode it as the instance's new data.
285
286
287.. method:: Binary.encode(out)
288
289 Write the XML-RPC base 64 encoding of this binary item to the out stream object.
290
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000291 The encoded data will have newlines every 76 characters as per
292 `RFC 2045 section 6.8 <http://tools.ietf.org/html/rfc2045#section-6.8>`_,
293 which was the de facto standard base64 specification when the
294 XML-RPC spec was written.
295
Georg Brandl116aa622007-08-15 14:28:22 +0000296It also supports certain of Python's built-in operators through a
297:meth:`__cmp__` method.
298
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000299Example usage of the binary objects. We're going to transfer an image over
300XMLRPC::
301
302 from SimpleXMLRPCServer import SimpleXMLRPCServer
303 import xmlrpclib
304
305 def python_logo():
306 handle = open("python_logo.jpg")
307 return xmlrpclib.Binary(handle.read())
308 handle.close()
309
310 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000311 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000312 server.register_function(python_logo, 'python_logo')
313
314 server.serve_forever()
315
316The client gets the image and saves it to a file::
317
318 import xmlrpclib
319
320 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
321 handle = open("fetched_python_logo.jpg", "w")
322 handle.write(proxy.python_logo().data)
323 handle.close()
Georg Brandl116aa622007-08-15 14:28:22 +0000324
325.. _fault-objects:
326
327Fault Objects
328-------------
329
330A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault
331objects have the following members:
332
333
334.. attribute:: Fault.faultCode
335
336 A string indicating the fault type.
337
338
339.. attribute:: Fault.faultString
340
341 A string containing a diagnostic message associated with the fault.
342
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000343In the following example we're going to intentionally cause a :exc:`Fault` by
344returning a complex type object. The server code::
345
346 from SimpleXMLRPCServer import SimpleXMLRPCServer
347
348 # A marshalling error is going to occur because we're returning a
349 # complex number
350 def add(x,y):
351 return x+y+0j
352
353 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000354 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000355 server.register_function(add, 'add')
356
357 server.serve_forever()
358
359The client code for the preceding server::
360
361 import xmlrpclib
362
363 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
364 try:
365 proxy.add(2, 5)
366 except xmlrpclib.Fault, err:
Georg Brandlf6945182008-02-01 11:56:49 +0000367 print("A fault occured")
368 print("Fault code: %d" % err.faultCode)
369 print("Fault string: %s" % err.faultString)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000370
371
Georg Brandl116aa622007-08-15 14:28:22 +0000372
373.. _protocol-error-objects:
374
375ProtocolError Objects
376---------------------
377
378A :class:`ProtocolError` object describes a protocol error in the underlying
379transport layer (such as a 404 'not found' error if the server named by the URI
380does not exist). It has the following members:
381
382
383.. attribute:: ProtocolError.url
384
385 The URI or URL that triggered the error.
386
387
388.. attribute:: ProtocolError.errcode
389
390 The error code.
391
392
393.. attribute:: ProtocolError.errmsg
394
395 The error message or diagnostic string.
396
397
398.. attribute:: ProtocolError.headers
399
Guido van Rossum460add42007-08-23 02:13:35 +0000400 A dict containing the headers of the HTTP/HTTPS request that triggered the
Georg Brandl116aa622007-08-15 14:28:22 +0000401 error.
402
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000403In the following example we're going to intentionally cause a :exc:`ProtocolError`
404by providing an invalid URI::
405
406 import xmlrpclib
407
408 # create a ServerProxy with an invalid URI
409 proxy = xmlrpclib.ServerProxy("http://invalidaddress/")
410
411 try:
412 proxy.some_method()
413 except xmlrpclib.ProtocolError, err:
Georg Brandlf6945182008-02-01 11:56:49 +0000414 print("A protocol error occured")
415 print("URL: %s" % err.url)
416 print("HTTP/HTTPS headers: %s" % err.headers)
417 print("Error code: %d" % err.errcode)
418 print("Error message: %s" % err.errmsg)
Georg Brandl116aa622007-08-15 14:28:22 +0000419
420MultiCall Objects
421-----------------
422
Georg Brandl116aa622007-08-15 14:28:22 +0000423In http://www.xmlrpc.com/discuss/msgReader%241208, an approach is presented to
424encapsulate multiple calls to a remote server into a single request.
425
426
427.. class:: MultiCall(server)
428
429 Create an object used to boxcar method calls. *server* is the eventual target of
430 the call. Calls can be made to the result object, but they will immediately
431 return ``None``, and only store the call name and parameters in the
432 :class:`MultiCall` object. Calling the object itself causes all stored calls to
433 be transmitted as a single ``system.multicall`` request. The result of this call
Georg Brandl9afde1c2007-11-01 20:32:30 +0000434 is a :term:`generator`; iterating over this generator yields the individual
435 results.
Georg Brandl116aa622007-08-15 14:28:22 +0000436
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000437A usage example of this class follows. The server code ::
Georg Brandl116aa622007-08-15 14:28:22 +0000438
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000439 from SimpleXMLRPCServer import SimpleXMLRPCServer
440
441 def add(x,y):
442 return x+y
443
444 def subtract(x, y):
445 return x-y
446
447 def multiply(x, y):
448 return x*y
449
450 def divide(x, y):
451 return x/y
452
453 # A simple server with simple arithmetic functions
454 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000455 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000456 server.register_multicall_functions()
457 server.register_function(add, 'add')
458 server.register_function(subtract, 'subtract')
459 server.register_function(multiply, 'multiply')
460 server.register_function(divide, 'divide')
461 server.serve_forever()
462
463The client code for the preceding server::
464
465 import xmlrpclib
466
467 proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
468 multicall = xmlrpclib.MultiCall(proxy)
469 multicall.add(7,3)
470 multicall.subtract(7,3)
471 multicall.multiply(7,3)
472 multicall.divide(7,3)
473 result = multicall()
474
Georg Brandlf6945182008-02-01 11:56:49 +0000475 print("7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result))
Georg Brandl116aa622007-08-15 14:28:22 +0000476
477
478Convenience Functions
479---------------------
480
481
482.. function:: boolean(value)
483
484 Convert any Python value to one of the XML-RPC Boolean constants, ``True`` or
485 ``False``.
486
487
488.. function:: dumps(params[, methodname[, methodresponse[, encoding[, allow_none]]]])
489
490 Convert *params* into an XML-RPC request. or into a response if *methodresponse*
491 is true. *params* can be either a tuple of arguments or an instance of the
492 :exc:`Fault` exception class. If *methodresponse* is true, only a single value
493 can be returned, meaning that *params* must be of length 1. *encoding*, if
494 supplied, is the encoding to use in the generated XML; the default is UTF-8.
495 Python's :const:`None` value cannot be used in standard XML-RPC; to allow using
496 it via an extension, provide a true value for *allow_none*.
497
498
499.. function:: loads(data[, use_datetime])
500
501 Convert an XML-RPC request or response into Python objects, a ``(params,
502 methodname)``. *params* is a tuple of argument; *methodname* is a string, or
503 ``None`` if no method name is present in the packet. If the XML-RPC packet
504 represents a fault condition, this function will raise a :exc:`Fault` exception.
505 The *use_datetime* flag can be used to cause date/time values to be presented as
Christian Heimes05e8be12008-02-23 18:30:17 +0000506 :class:`datetime.datetime` objects; this is false by default.
Georg Brandl116aa622007-08-15 14:28:22 +0000507
Georg Brandl116aa622007-08-15 14:28:22 +0000508
509.. _xmlrpc-client-example:
510
511Example of Client Usage
512-----------------------
513
514::
515
516 # simple test program (from the XML-RPC specification)
517 from xmlrpclib import ServerProxy, Error
518
519 # server = ServerProxy("http://localhost:8000") # local server
520 server = ServerProxy("http://betty.userland.com")
521
Collin Winterc79461b2007-09-01 23:34:30 +0000522 print(server)
Georg Brandl116aa622007-08-15 14:28:22 +0000523
524 try:
Collin Winterc79461b2007-09-01 23:34:30 +0000525 print(server.examples.getStateName(41))
Georg Brandl116aa622007-08-15 14:28:22 +0000526 except Error as v:
Collin Winterc79461b2007-09-01 23:34:30 +0000527 print("ERROR", v)
Georg Brandl116aa622007-08-15 14:28:22 +0000528
529To access an XML-RPC server through a proxy, you need to define a custom
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000530transport. The following example shows how:
Georg Brandl116aa622007-08-15 14:28:22 +0000531
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000532.. Example taken from http://lowlife.jp/nobonobo/wiki/xmlrpcwithproxy.html
Georg Brandl116aa622007-08-15 14:28:22 +0000533
534::
535
536 import xmlrpclib, httplib
537
538 class ProxiedTransport(xmlrpclib.Transport):
539 def set_proxy(self, proxy):
540 self.proxy = proxy
541 def make_connection(self, host):
542 self.realhost = host
543 h = httplib.HTTP(self.proxy)
544 return h
545 def send_request(self, connection, handler, request_body):
546 connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
547 def send_host(self, connection, host):
548 connection.putheader('Host', self.realhost)
549
550 p = ProxiedTransport()
551 p.set_proxy('proxy-server:8080')
552 server = xmlrpclib.Server('http://time.xmlrpc.com/RPC2', transport=p)
Collin Winterc79461b2007-09-01 23:34:30 +0000553 print(server.currentTime.getCurrentTime())
Georg Brandl116aa622007-08-15 14:28:22 +0000554
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000555
556Example of Client and Server Usage
557----------------------------------
558
559See :ref:`simplexmlrpcserver-example`.
560
561