| 1 |
XMLRPC Methods |
|---|
| 2 |
|
|---|
| 3 |
The XMLRPC Method product provides support for remote procedure |
|---|
| 4 |
calls with the "XML-RPC":http://www.xml-rpc.com standard. |
|---|
| 5 |
The intent is to create a plug-in replacement for an external method. |
|---|
| 6 |
|
|---|
| 7 |
Not everything is callable: For instance you can't call title or id |
|---|
| 8 |
on a folder, but you can call 'title_or_id', 'title_and_id', 'getId' |
|---|
| 9 |
and 'getPhysicalPath'. Essentially everything that will also work as |
|---|
| 10 |
'http://remote.com/folder/title_or_id'. The method 'propertyItems' returns |
|---|
| 11 |
an especially complex and interesting result. |
|---|
| 12 |
|
|---|
| 13 |
You can also do privileged things that requires a login. You simply |
|---|
| 14 |
add the username and password to the remote url the conventional way: |
|---|
| 15 |
|
|---|
| 16 |
http://username:password@remote.com/ |
|---|
| 17 |
|
|---|
| 18 |
Then you can call methods such as 'document_src' on DTML methods etc. |
|---|
| 19 |
|
|---|
| 20 |
Sending arguments |
|---|
| 21 |
|
|---|
| 22 |
XMLRPC allows you to send a number of arguments to the remote |
|---|
| 23 |
procedure. These arguments can be integers, strings, lists, dictionaries |
|---|
| 24 |
etc. and combinations hereof. |
|---|
| 25 |
|
|---|
| 26 |
To test with the XMLRPCLIB example, create a XMLRPC method with the |
|---|
| 27 |
name 'statelookup', the URL 'http://betty.userland.com' and the method |
|---|
| 28 |
'examples.getStateName'. |
|---|
| 29 |
|
|---|
| 30 |
The create a DTML method with the call: '<dtml-var "statelookup(5)">' |
|---|
| 31 |
and see what happens. |
|---|
| 32 |
|
|---|
| 33 |
Sending arguments to remote DTML Methods |
|---|
| 34 |
|
|---|
| 35 |
Try this: create a DTML method with address /welcome on the remote |
|---|
| 36 |
computer with the two lines:: |
|---|
| 37 |
|
|---|
| 38 |
<dtml-call "REQUEST.set('res', 'Welcome to ' + place )"> |
|---|
| 39 |
<dtml-return "REQUEST['res']"> |
|---|
| 40 |
|
|---|
| 41 |
Then on the local computer create an XMLRPC method called querywelcome |
|---|
| 42 |
with the URL http://remote.com/, and a method of welcome. |
|---|
| 43 |
|
|---|
| 44 |
To call the remote procedure from a DTML Method do:: |
|---|
| 45 |
|
|---|
| 46 |
<dtml-var "querywelcome( {'place':'my world'}) "> |
|---|
| 47 |
|
|---|
| 48 |
If the method returns a list or a dictionary, you can use the <dtml-in *method* mapping> |
|---|
| 49 |
|
|---|
| 50 |
Calling a Z SQL Method: |
|---|
| 51 |
|
|---|
| 52 |
You can't do it directly. The Z SQL Method returns objects, so you |
|---|
| 53 |
must use a DTML Method to build a list of dictionaries. Let's assume |
|---|
| 54 |
we have a table with the two columns 'ISSUE_ID' and 'ISSUE_NAME'. Then |
|---|
| 55 |
your DTML Method will look like this:: |
|---|
| 56 |
|
|---|
| 57 |
<dtml-call "REQUEST.set('result',[])"> |
|---|
| 58 |
<dtml-in select_all_from_issues> |
|---|
| 59 |
<dtml-call "REQUEST['result'].append({'ID': ISSUE_ID, 'NAME':ISSUE_NAME}) "> |
|---|
| 60 |
</dtml-in> |
|---|
| 61 |
<dtml-return "REQUEST['result']"> |
|---|
| 62 |
|
|---|
| 63 |
Other things to note: |
|---|
| 64 |
|
|---|
| 65 |
When an object is called via XML-RPC, there's nothing in the REQUEST |
|---|
| 66 |
variable. You can create variables in the namespace, but that's it. Some |
|---|
| 67 |
versions of Zope can't see simple variables. So in the example above you |
|---|
| 68 |
have to write '<dtml-return "REQUEST['result']">' rather than |
|---|
| 69 |
'<dtml-return result>' to be one the safe side. |
|---|
| 70 |
|
|---|
| 71 |
Due to its nature XMLRPC methods can take a long time to execute or |
|---|
| 72 |
not return at all if the remote server is unresponsive. Therefore make |
|---|
| 73 |
use of the timeout value. The timeout functionality is implemented |
|---|
| 74 |
with threads. |
|---|
| 75 |
|
|---|
| 76 |
Another optimization technique available to you is to cache the results. |
|---|
| 77 |
We have made XMLRPCMethod cacheable with RAMCacheManager. |
|---|
| 78 |
|
|---|
| 79 |
Bugs |
|---|
| 80 |
|
|---|
| 81 |
XML-RPC takes only positional parameters. Since arguments given in |
|---|
| 82 |
the 'QUERY_STRING' are keyword arguments as in ?x=1&y=2 |
|---|
| 83 |
it isn't possible to specify arguments in GET or POST statements. |
|---|
| 84 |
|
|---|
| 85 |
The <dateTime.iso8601> element is difficult to use. It is not |
|---|
| 86 |
converted to a Zope DateTime. |
|---|
| 87 |
|
|---|
| 88 |
References |
|---|
| 89 |
|
|---|
| 90 |
"Directory of services":http://www.xmlrpc.com/directory/1568/services |
|---|