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 |
---|