Cool! This should go in the manual.
On Sep 12, 10:47 am, Ross Peoples <ross.peop...@gmail.com> wrote: > 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!