blob: d25cbaf5a53fc1d84abffa80dff3ed07a22906cd [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
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
Georg Brandl7f01a132009-09-16 15:58:14 +000020.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, allow_none=False, use_datetime=False)
Georg Brandl116aa622007-08-15 14:28:22 +000021
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
Georg Brandl38eceaa2008-05-26 11:14:17 +000089 :exc:`Error`. Note that the xmlrpc client module currently does not marshal
Georg Brandl22b34312009-07-26 14:54:51 +000090 instances of subclasses of built-in types.
Georg Brandl116aa622007-08-15 14:28:22 +000091
92 When passing strings, characters special to XML such as ``<``, ``>``, and ``&``
93 will be automatically escaped. However, it's the caller's responsibility to
94 ensure that the string is free of characters that aren't allowed in XML, such as
95 the control characters with ASCII values between 0 and 31 (except, of course,
96 tab, newline and carriage return); failing to do this will result in an XML-RPC
97 request that isn't well-formed XML. If you have to pass arbitrary strings via
98 XML-RPC, use the :class:`Binary` wrapper class described below.
99
100 :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
101 compatibility. New code should use :class:`ServerProxy`.
102
Georg Brandl116aa622007-08-15 14:28:22 +0000103
104.. seealso::
105
106 `XML-RPC HOWTO <http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html>`_
Christian Heimesa62da1d2008-01-12 19:39:10 +0000107 A good description of XML-RPC operation and client software in several languages.
Georg Brandl116aa622007-08-15 14:28:22 +0000108 Contains pretty much everything an XML-RPC client developer needs to know.
109
Christian Heimesa62da1d2008-01-12 19:39:10 +0000110 `XML-RPC Introspection <http://xmlrpc-c.sourceforge.net/introspection.html>`_
111 Describes the XML-RPC protocol extension for introspection.
Georg Brandl116aa622007-08-15 14:28:22 +0000112
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000113 `XML-RPC Specification <http://www.xmlrpc.com/spec>`_
114 The official specification.
115
116 `Unofficial XML-RPC Errata <http://effbot.org/zone/xmlrpc-errata.htm>`_
117 Fredrik Lundh's "unofficial errata, intended to clarify certain
118 details in the XML-RPC specification, as well as hint at
119 'best practices' to use when designing your own XML-RPC
120 implementations."
Georg Brandl116aa622007-08-15 14:28:22 +0000121
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
Georg Brandl94606482009-05-04 20:46:44 +0000147 server. It returns an array of possible signatures for this method. A signature
Georg Brandl116aa622007-08-15 14:28:22 +0000148 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
Georg Brandl94606482009-05-04 20:46:44 +0000161 than list.
Georg Brandl116aa622007-08-15 14:28:22 +0000162
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
Georg Brandl116aa622007-08-15 14:28:22 +0000171
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000172A working example follows. The server code::
173
Georg Brandl38eceaa2008-05-26 11:14:17 +0000174 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000175
176 def is_even(n):
177 return n%2 == 0
178
179 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000180 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000181 server.register_function(is_even, "is_even")
182 server.serve_forever()
183
184The client code for the preceding server::
185
Georg Brandl38eceaa2008-05-26 11:14:17 +0000186 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000187
Georg Brandl38eceaa2008-05-26 11:14:17 +0000188 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Georg Brandlf6945182008-02-01 11:56:49 +0000189 print("3 is even: %s" % str(proxy.is_even(3)))
190 print("100 is even: %s" % str(proxy.is_even(100)))
Georg Brandl116aa622007-08-15 14:28:22 +0000191
192.. _datetime-objects:
193
194DateTime Objects
195----------------
196
Christian Heimes05e8be12008-02-23 18:30:17 +0000197This class may be initialized with seconds since the epoch, a time
198tuple, an ISO 8601 time/date string, or a :class:`datetime.datetime`
199instance. It has the following methods, supported mainly for internal
200use by the marshalling/unmarshalling code:
Georg Brandl116aa622007-08-15 14:28:22 +0000201
202
203.. method:: DateTime.decode(string)
204
205 Accept a string as the instance's new time value.
206
207
208.. method:: DateTime.encode(out)
209
210 Write the XML-RPC encoding of this :class:`DateTime` item to the *out* stream
211 object.
212
Georg Brandl05f5ab72008-09-24 09:11:47 +0000213It also supports certain of Python's built-in operators through rich comparison
Georg Brandl116aa622007-08-15 14:28:22 +0000214and :meth:`__repr__` methods.
215
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000216A working example follows. The server code::
217
218 import datetime
Georg Brandl38eceaa2008-05-26 11:14:17 +0000219 from xmlrpc.server import SimpleXMLRPCServer
220 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000221
222 def today():
223 today = datetime.datetime.today()
Georg Brandl38eceaa2008-05-26 11:14:17 +0000224 return xmlrpc.client.DateTime(today)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000225
226 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000227 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000228 server.register_function(today, "today")
229 server.serve_forever()
230
231The client code for the preceding server::
232
Georg Brandl38eceaa2008-05-26 11:14:17 +0000233 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000234 import datetime
235
Georg Brandl38eceaa2008-05-26 11:14:17 +0000236 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000237
238 today = proxy.today()
239 # convert the ISO8601 string to a datetime object
240 converted = datetime.datetime.strptime(today.value, "%Y%m%dT%H:%M:%S")
Georg Brandlf6945182008-02-01 11:56:49 +0000241 print("Today: %s" % converted.strftime("%d.%m.%Y, %H:%M"))
Georg Brandl116aa622007-08-15 14:28:22 +0000242
243.. _binary-objects:
244
245Binary Objects
246--------------
247
248This class may be initialized from string data (which may include NULs). The
249primary access to the content of a :class:`Binary` object is provided by an
250attribute:
251
252
253.. attribute:: Binary.data
254
255 The binary data encapsulated by the :class:`Binary` instance. The data is
256 provided as an 8-bit string.
257
258:class:`Binary` objects have the following methods, supported mainly for
259internal use by the marshalling/unmarshalling code:
260
261
262.. method:: Binary.decode(string)
263
264 Accept a base64 string and decode it as the instance's new data.
265
266
267.. method:: Binary.encode(out)
268
269 Write the XML-RPC base 64 encoding of this binary item to the out stream object.
270
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000271 The encoded data will have newlines every 76 characters as per
272 `RFC 2045 section 6.8 <http://tools.ietf.org/html/rfc2045#section-6.8>`_,
273 which was the de facto standard base64 specification when the
274 XML-RPC spec was written.
275
Georg Brandl05f5ab72008-09-24 09:11:47 +0000276It also supports certain of Python's built-in operators through :meth:`__eq__`
277and :meth:`__ne__` methods.
Georg Brandl116aa622007-08-15 14:28:22 +0000278
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000279Example usage of the binary objects. We're going to transfer an image over
280XMLRPC::
281
Georg Brandl38eceaa2008-05-26 11:14:17 +0000282 from xmlrpc.server import SimpleXMLRPCServer
283 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000284
285 def python_logo():
Victor Stinner757db832010-01-30 02:16:55 +0000286 with open("python_logo.jpg", "rb") as handle:
287 return xmlrpc.client.Binary(handle.read())
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000288
289 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000290 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000291 server.register_function(python_logo, 'python_logo')
292
293 server.serve_forever()
294
295The client gets the image and saves it to a file::
296
Georg Brandl38eceaa2008-05-26 11:14:17 +0000297 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000298
Georg Brandl38eceaa2008-05-26 11:14:17 +0000299 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Victor Stinner757db832010-01-30 02:16:55 +0000300 with open("fetched_python_logo.jpg", "wb") as handle:
301 handle.write(proxy.python_logo().data)
Georg Brandl116aa622007-08-15 14:28:22 +0000302
303.. _fault-objects:
304
305Fault Objects
306-------------
307
308A :class:`Fault` object encapsulates the content of an XML-RPC fault tag. Fault
309objects have the following members:
310
311
312.. attribute:: Fault.faultCode
313
314 A string indicating the fault type.
315
316
317.. attribute:: Fault.faultString
318
319 A string containing a diagnostic message associated with the fault.
320
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000321In the following example we're going to intentionally cause a :exc:`Fault` by
322returning a complex type object. The server code::
323
Georg Brandl38eceaa2008-05-26 11:14:17 +0000324 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000325
326 # A marshalling error is going to occur because we're returning a
327 # complex number
328 def add(x,y):
329 return x+y+0j
330
331 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000332 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000333 server.register_function(add, 'add')
334
335 server.serve_forever()
336
337The client code for the preceding server::
338
Georg Brandl38eceaa2008-05-26 11:14:17 +0000339 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000340
Georg Brandl38eceaa2008-05-26 11:14:17 +0000341 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000342 try:
343 proxy.add(2, 5)
Georg Brandl0dedf452009-05-22 16:44:06 +0000344 except xmlrpc.client.Fault as err:
Georg Brandl2ee470f2008-07-16 12:55:28 +0000345 print("A fault occurred")
Georg Brandlf6945182008-02-01 11:56:49 +0000346 print("Fault code: %d" % err.faultCode)
347 print("Fault string: %s" % err.faultString)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000348
349
Georg Brandl116aa622007-08-15 14:28:22 +0000350
351.. _protocol-error-objects:
352
353ProtocolError Objects
354---------------------
355
356A :class:`ProtocolError` object describes a protocol error in the underlying
357transport layer (such as a 404 'not found' error if the server named by the URI
358does not exist). It has the following members:
359
360
361.. attribute:: ProtocolError.url
362
363 The URI or URL that triggered the error.
364
365
366.. attribute:: ProtocolError.errcode
367
368 The error code.
369
370
371.. attribute:: ProtocolError.errmsg
372
373 The error message or diagnostic string.
374
375
376.. attribute:: ProtocolError.headers
377
Guido van Rossum460add42007-08-23 02:13:35 +0000378 A dict containing the headers of the HTTP/HTTPS request that triggered the
Georg Brandl116aa622007-08-15 14:28:22 +0000379 error.
380
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000381In the following example we're going to intentionally cause a :exc:`ProtocolError`
382by providing an invalid URI::
383
Georg Brandl38eceaa2008-05-26 11:14:17 +0000384 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000385
Benjamin Peterson5e55b3e2010-02-03 02:35:45 +0000386 # create a ServerProxy with an URI that doesn't respond to XMLRPC requests
387 proxy = xmlrpc.client.ServerProxy("http://google.com/")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000388
389 try:
390 proxy.some_method()
Georg Brandl0dedf452009-05-22 16:44:06 +0000391 except xmlrpc.client.ProtocolError as err:
Georg Brandl2ee470f2008-07-16 12:55:28 +0000392 print("A protocol error occurred")
Georg Brandlf6945182008-02-01 11:56:49 +0000393 print("URL: %s" % err.url)
394 print("HTTP/HTTPS headers: %s" % err.headers)
395 print("Error code: %d" % err.errcode)
396 print("Error message: %s" % err.errmsg)
Georg Brandl116aa622007-08-15 14:28:22 +0000397
398MultiCall Objects
399-----------------
400
Georg Brandl116aa622007-08-15 14:28:22 +0000401In http://www.xmlrpc.com/discuss/msgReader%241208, an approach is presented to
402encapsulate multiple calls to a remote server into a single request.
403
404
405.. class:: MultiCall(server)
406
407 Create an object used to boxcar method calls. *server* is the eventual target of
408 the call. Calls can be made to the result object, but they will immediately
409 return ``None``, and only store the call name and parameters in the
410 :class:`MultiCall` object. Calling the object itself causes all stored calls to
411 be transmitted as a single ``system.multicall`` request. The result of this call
Georg Brandl9afde1c2007-11-01 20:32:30 +0000412 is a :term:`generator`; iterating over this generator yields the individual
413 results.
Georg Brandl116aa622007-08-15 14:28:22 +0000414
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000415A usage example of this class follows. The server code ::
Georg Brandl116aa622007-08-15 14:28:22 +0000416
Georg Brandl38eceaa2008-05-26 11:14:17 +0000417 from xmlrpc.server import SimpleXMLRPCServer
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000418
419 def add(x,y):
420 return x+y
421
422 def subtract(x, y):
423 return x-y
424
425 def multiply(x, y):
426 return x*y
427
428 def divide(x, y):
429 return x/y
430
431 # A simple server with simple arithmetic functions
432 server = SimpleXMLRPCServer(("localhost", 8000))
Georg Brandlf6945182008-02-01 11:56:49 +0000433 print("Listening on port 8000...")
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000434 server.register_multicall_functions()
435 server.register_function(add, 'add')
436 server.register_function(subtract, 'subtract')
437 server.register_function(multiply, 'multiply')
438 server.register_function(divide, 'divide')
439 server.serve_forever()
440
441The client code for the preceding server::
442
Georg Brandl38eceaa2008-05-26 11:14:17 +0000443 import xmlrpc.client
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000444
Georg Brandl38eceaa2008-05-26 11:14:17 +0000445 proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
446 multicall = xmlrpc.client.MultiCall(proxy)
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000447 multicall.add(7,3)
448 multicall.subtract(7,3)
449 multicall.multiply(7,3)
450 multicall.divide(7,3)
451 result = multicall()
452
Georg Brandlf6945182008-02-01 11:56:49 +0000453 print("7+3=%d, 7-3=%d, 7*3=%d, 7/3=%d" % tuple(result))
Georg Brandl116aa622007-08-15 14:28:22 +0000454
455
456Convenience Functions
457---------------------
458
Georg Brandl7f01a132009-09-16 15:58:14 +0000459.. function:: dumps(params, methodname=None, methodresponse=None, encoding=None, allow_none=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000460
461 Convert *params* into an XML-RPC request. or into a response if *methodresponse*
462 is true. *params* can be either a tuple of arguments or an instance of the
463 :exc:`Fault` exception class. If *methodresponse* is true, only a single value
464 can be returned, meaning that *params* must be of length 1. *encoding*, if
465 supplied, is the encoding to use in the generated XML; the default is UTF-8.
466 Python's :const:`None` value cannot be used in standard XML-RPC; to allow using
467 it via an extension, provide a true value for *allow_none*.
468
469
Georg Brandl7f01a132009-09-16 15:58:14 +0000470.. function:: loads(data, use_datetime=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000471
472 Convert an XML-RPC request or response into Python objects, a ``(params,
473 methodname)``. *params* is a tuple of argument; *methodname* is a string, or
474 ``None`` if no method name is present in the packet. If the XML-RPC packet
475 represents a fault condition, this function will raise a :exc:`Fault` exception.
476 The *use_datetime* flag can be used to cause date/time values to be presented as
Christian Heimes05e8be12008-02-23 18:30:17 +0000477 :class:`datetime.datetime` objects; this is false by default.
Georg Brandl116aa622007-08-15 14:28:22 +0000478
Georg Brandl116aa622007-08-15 14:28:22 +0000479
480.. _xmlrpc-client-example:
481
482Example of Client Usage
483-----------------------
484
485::
486
487 # simple test program (from the XML-RPC specification)
Georg Brandl38eceaa2008-05-26 11:14:17 +0000488 from xmlrpc.client import ServerProxy, Error
Georg Brandl116aa622007-08-15 14:28:22 +0000489
490 # server = ServerProxy("http://localhost:8000") # local server
491 server = ServerProxy("http://betty.userland.com")
492
Collin Winterc79461b2007-09-01 23:34:30 +0000493 print(server)
Georg Brandl116aa622007-08-15 14:28:22 +0000494
495 try:
Collin Winterc79461b2007-09-01 23:34:30 +0000496 print(server.examples.getStateName(41))
Georg Brandl116aa622007-08-15 14:28:22 +0000497 except Error as v:
Collin Winterc79461b2007-09-01 23:34:30 +0000498 print("ERROR", v)
Georg Brandl116aa622007-08-15 14:28:22 +0000499
500To access an XML-RPC server through a proxy, you need to define a custom
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000501transport. The following example shows how:
Georg Brandl116aa622007-08-15 14:28:22 +0000502
Christian Heimes5b5e81c2007-12-31 16:14:33 +0000503.. Example taken from http://lowlife.jp/nobonobo/wiki/xmlrpcwithproxy.html
Georg Brandl116aa622007-08-15 14:28:22 +0000504
505::
506
Georg Brandl24420152008-05-26 16:32:26 +0000507 import xmlrpc.client, http.client
Georg Brandl116aa622007-08-15 14:28:22 +0000508
Georg Brandl38eceaa2008-05-26 11:14:17 +0000509 class ProxiedTransport(xmlrpc.client.Transport):
Georg Brandl116aa622007-08-15 14:28:22 +0000510 def set_proxy(self, proxy):
511 self.proxy = proxy
512 def make_connection(self, host):
513 self.realhost = host
Georg Brandl06788c92009-01-03 21:31:47 +0000514 h = http.client.HTTP(self.proxy)
515 return h
Georg Brandl116aa622007-08-15 14:28:22 +0000516 def send_request(self, connection, handler, request_body):
517 connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
518 def send_host(self, connection, host):
519 connection.putheader('Host', self.realhost)
520
521 p = ProxiedTransport()
522 p.set_proxy('proxy-server:8080')
Georg Brandl38eceaa2008-05-26 11:14:17 +0000523 server = xmlrpc.client.Server('http://time.xmlrpc.com/RPC2', transport=p)
Collin Winterc79461b2007-09-01 23:34:30 +0000524 print(server.currentTime.getCurrentTime())
Georg Brandl116aa622007-08-15 14:28:22 +0000525
Christian Heimescbf3b5c2007-12-03 21:02:03 +0000526
527Example of Client and Server Usage
528----------------------------------
529
530See :ref:`simplexmlrpcserver-example`.
531
532