One of the nice things about SOAP is the WDSL that gives you information 
about the methods the service supports. I recently discovered that you can 
do the same thing with XML-RPC. The trick is to document your methods 
properly, like you should be doing anyways. Lets say I have the following 
controller:

@service.xmlrpc
@service.jsonrpc
def add(num1, num2):
    """
    Adds two numbers together.
    
    add(num1, num2) -> number
    
    Arguments:
    num1        First number
    num2        Second number
    
    Returns:
    The sum of the two numbers.
    
    Examples:
    add(2, 2) -> 4
    add(2.5, 2.5) -> 5.0
    """
    return num1 + num2

@service.xmlrpc
@service.jsonrpc
def concat(str1, str2, str3=''):
    """
    Concatenates two or three strings.
    
    concat(str1, str2, str3='') -> string
    
    Arguments:
    str1        First string
    str2        Second string
    str3        (Optional) Third string
    
    Returns:
    The concatenated string.
    
    Examples:
    concat('hello', ' world') -> 'hello world'
    concat('hello', ' world', ' !!!') -> 'hello world !!!
    """
    return str1 + str2 + str3

@service.xmlrpc
@service.jsonrpc
def date():
    """
    Returns the server's current date and time.
    """
    return datetime.datetime.now()


Now let's connect using xmlrpclib:

>>> import xmlrpclib
>>> x = 
xmlrpclib.ServerProxy('http://127.0.0.1:8000/rpc_test/default/call/xmlrpc')


Now, we could start calling the methods as usual, or we could do a little 
introspection to see what methods are available, and even get the docstrings 
of those methods:

>>> print x.system.listMethods()
['add', 'concat', 'date', 'system.listMethods', 'system.methodHelp', 
'system.methodSignature']

>>> print x.system.methodHelp('concat')
Concatenates two or three strings.

concat(str1, str2, str3='') -> string

Arguments:
str1        First string
str2        Second string
str3        (Optional) Third string

Returns:
The concatenated string.

Examples:
concat('hello', ' world') -> 'hello world'
concat('hello', ' world', ' !!!') -> 'hello world !!!'


>>> x.concat('hello', 'web2py')
'helloweb2py'


Very cool! However, you will notice that there is another method in there: 
system.methodSignature(). This would show the signature of the method (i.e. 
concat(str1, str2, str3=''), however, it seems that web2py's XMLRPC server 
implementation (or SimpleXMLRPCServer.py) doesn't support this, as it 
returns 'signatures not supported' whenever you try to call this method.

I hope that someone finds this useful!

Reply via email to