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