Penguin
Diff: HowToXMLRPCHOWTO
EditPageHistoryDiffInfoLikePages

Differences between version 3 and predecessor to the previous major change of HowToXMLRPCHOWTO.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Thursday, October 21, 2004 5:35:58 pm by AristotlePagaltzis Revert
Older page: version 2 Last edited on Friday, June 7, 2002 1:07:52 am by perry Revert
@@ -1,1151 +1 @@
-XML-RPC HOWTO  
-!!!XML-RPC HOWTO  
-!Eric !KiddSource Builders  
-  
-eric.kidd@pobox.com  
-  
-  
-!And Other Contributors  
-  
-Copyright (c) 2001 by Eric Kidd  
-  
-  
-  
-.8., 2001-04-12  
-  
-  
-__Revision History__Revision .8.02001-04-12Updated section on common interfaces. Added pointer to  
-XML-RPC.Net information.Revision .7.02001-04-03Added section on C++ proxy classes.Revision .6.02001-02-02Added sections on Ruby, K and common  
-interfaces.Revision .5.02001-01-23Initial version.  
-  
-  
-  
-  
-  
-Describes how to use XML-RPC to implement clients and servers  
-in a variety of languages. Provides example code in Perl, Python, C,  
-C++, Java, PHP and other languages. Includes sections on Zope and KDE  
-2.. Applies to all operating systems with XML-RPC support.  
-  
-  
-  
-  
-  
-----; __Table of Contents__; 1. Legal Notice; 2. What is XML-RPC?: ; 2.1. How it Works; 2.2. Supported Data Types; 2.3. The History of XML-RPC; 3. XML-RPC vs. Other Protocols: ; 3.1. XML-RPC vs. CORBA; 3.2. XML-RPC vs. DCOM; 3.3. XML-RPC vs. SOAP; 4. Common XML-RPC Interfaces: ; 4.1. Introspection: Discovering Server APIs; 4.2. Boxcarring: Sending Multiple Requests at Once; 5. A Sample API: sumAndDifference; 6. Using XML-RPC with Perl: ; 6.1. A Perl Client; 6.2. A Stand-Alone Perl Server; 6.3. A CGI-Based Perl Server; 7. Using XML-RPC with Python: ; 7.1. A Python Client; 8. Using XML-RPC with C and C++: ; 8.1. A C Client; 8.2. A C++ Client; 8.3. A C++ Client with Proxy Classes; 8.4. A CGI-Based C Server; 9. Using XML-RPC with Java: ; 9.1. A Java Client; 9.2. A Stand-Alone Java Server; 10. Using XML-RPC with PHP: ; 10.1. A PHP Client; 10.2. A PHP Server; 11. Using XML-RPC with Microsoft .NET; 12. Using XML-RPC with Ruby: ; 12.1. A Ruby Client; 12.2. A Ruby Server; 13. Using XML-RPC with Proprietary Languages: ; 13.1. Using XML-RPC with K; 14. Applications with Built-in XML-RPC Support: ; 14.1. Zope; 14.2. KDE 2.; 15. About This Document: ; 15.1. New Versions of This Document; 15.2. Contributors to the XML-RPC HOWTO; 15.3. Submitting Other Snippets----  
-!!!1. Legal Notice  
-  
-Permission is granted to copy, distribute and/or modify this  
-document under the terms of the ''GNU Free  
-Documentation License'', Version 1.1 or any later  
-version published by the Free Software Foundation with no Invariant  
-Sections, no Front-Cover Texts, and no Back-Cover Texts. You may  
-obtain a copy of the ''GNU Free Documentation  
-License'' from the Free Software Foundation by visiting  
-their Web site  
-or by writing to: Free Software Foundation, Inc., 59 Temple Place -  
-Suite 330, Boston, MA 02111-1307, USA.  
-  
-  
-  
-This manual contains short example programs ("the  
-Software"). Permission is hereby granted, free of charge, to  
-any person obtaining a copy of the Software, to deal in the Software  
-without restriction, including without limitation the rights to use,  
-copy, modify, merge, publish, distribute, sublicense, and/or sell  
-copies of the Software, and to permit persons to whom the Software is  
-furnished to do so, subject to the following condition:  
-  
-  
-  
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY  
-OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE  
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY  
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE  
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
-  
-----  
-!!!2. What is XML-RPC?  
-  
-XML-RPC is a simple,  
-portable way to make remote procedure calls over HTTP. It can be used  
-with Perl, Java, Python, C, C++, PHP and many other programming  
-languages. Implementations are available for Unix, Windows and the  
-Macintosh.  
-  
-  
-  
-Here's a short XML-RPC client written in Perl. (We use Ken  
-!MacLeod's Frontier::Client  
-module.)  
-  
-  
-use Frontier::Client;  
-$server = Frontier::Client-bnew(url =b 'http://betty.userland.com/RPC2');  
-$name = $server-bcall('examples.getStateName', 41);  
-print "$name\n";  
-  
-When run, this program will connect to the remote server, get the  
-state name, and print it. (State #41 should be South Dakota in this  
-example.)  
-  
-  
-  
-Here's the same program in Python. (This time, we use Fredrik  
-Lundh's xmlrpclib.)  
-  
-  
-pythonb import xmlrpclib  
-pythonb server = xmlrpclib.Server("http://betty.userland.com/RPC2")  
-pythonb server.examples.getStateName(41)  
-'South Dakota'  
-  
-In the following chapters, you'll learn how to write XML-RPC  
-clients and servers in a variety of programming languages.  
-  
-----  
-!!2.1. How it Works  
-  
-XML-RPC is described fully in Dave Winer's official specification. If  
-you're curious, go ahead and take a look-it's a quick and  
-straight-forward read.  
-  
-  
-  
-On the wire, XML-RPC values are encoded as XML:  
-  
-  
-`methodCallb  
-`methodNamebsample.sumAndDifference`/methodNameb  
-`paramsb  
-`paramb`valueb`intb5`/intb`/valueb`/paramb  
-`paramb`valueb`intb3`/intb`/valueb`/paramb  
-`/paramsb  
-`/methodCallb  
-  
-This is verbose, but compresses readily. It's also faster than  
-you might expect-according to measurements by Rick Blair, a  
-round-trip XML-RPC call takes 3 milliseconds using Hannes  
-Wallnöfer's Java implementation.  
-  
-----  
-!!2.2. Supported Data Types  
-  
-XML-RPC supports the following data types:  
-  
-  
-  
-  
-  
-; int:  
-  
-A signed, 32-bit integer.  
-  
-; string:  
-  
-An ASCII string, which may contain NULL bytes. (Actually,  
-several XML-RPC implementations support Unicode, thanks to the  
-underlying features of XML.)  
-  
-; boolean:  
-  
-Either true or false.  
-  
-; double:  
-  
-A double-precision floating point number. (Accuracy may  
-be limited in some implementations.)  
-  
-; dateTime.iso8601:  
-  
-A date and time. Unfortunately, since XML-RPC forbids the  
-use of timezones, this is very nearly useless.  
-  
-; base64:  
-  
-Raw binary data of any length; encoded using Base64 on  
-the wire. Very useful. (Some implementations don't like to  
-receive zero bytes of data, though.)  
-  
-; array:  
-  
-An one-dimensional array of values. Individual values may  
-be of any type.  
-  
-; struct:  
-  
-A collection of key-value pairs. The keys are strings;  
-the values may be of any type.  
-  
-----  
-!!2.3. The History of XML-RPC  
-  
-XML-RPC was inspired by two earlier protocols. The first is an  
-anonymous RPC protocol designed by Dave Winer and announced in an  
-old  
-!DaveNet essay. (This is why XML-RPC servers are often  
-installed under /RPC2.) The other, more  
-important inspiration was an early draft of the SOAP protocol.  
-  
-  
-  
-A longer history of  
-XML-RPC has been generously provided by Dave Winer. This also  
-explains the relationship between XML-RPC and SOAP.  
-  
-----  
-!!!3. XML-RPC vs. Other Protocols  
-  
-XML-RPC is not the only way to make remote procedure calls. Other  
-popular protocols include CORBA, DCOM and SOAP. Each of these protocols  
-has advantages and disadvantages.  
-  
-  
-  
-The opinions in the section are obviously biased; please take  
-them with a grain of salt.  
-  
-----  
-!!3.1. XML-RPC vs. CORBA  
-  
-CORBA is a popular  
-protocol for writing distributed, object-oriented applications. It's  
-typically used in multi-tier enterprise applications. Recently, it's  
-also been adopted by the Gnome project for  
-interapplication communication.  
-  
-  
-  
-CORBA is well-supported by many vendors and several free  
-software projects. CORBA works well with Java and C++, and is  
-available for many other languages. CORBA also provides an excellent  
-''interface definition language'' (IDL), allowing  
-you to define readable, object-oriented APIs.  
-  
-  
-  
-Unfortunately, CORBA is very complex. It has a steep  
-learning curve, requires significant effort to implement, and  
-requires fairly sophisticated clients. It's better-suited to  
-enterprise and desktop applications than it is to distributed web  
-applications.  
-  
-----  
-!!3.2. XML-RPC vs. DCOM  
-  
-DCOM is  
-Microsoft's answer to CORBA. It's great if you're already using COM  
-components, and you don't need to talk to non-Microsoft  
-systems. Otherwise, it won't help you very much.  
-  
-----  
-!!3.3. XML-RPC vs. SOAP  
-  
-SOAP is very  
-similar to XML-RPC. It, too, works by marshaling procedure calls  
-over HTTP as XML documents. Unfortunately, SOAP appears to be  
-suffering from specification creep.  
-  
-  
-  
-SOAP was originally created as a collaboration between  
-!UserLand, !DevelopMentor and Microsoft. The initial public release was  
-basically XML-RPC with namespaces and longer element names. Since  
-then, however, SOAP has been turned over a W3C working group.  
-  
-  
-  
-Unfortunately, the working group has been adding a laundry-list  
-of strange features to SOAP. As of the current writing, SOAP supports  
-XML Schemas, enumerations, strange hybrids of structs and arrays, and  
-custom types. At the same time, several aspects of SOAP are  
-implementation defined.  
-  
-  
-  
-Basically, if you like XML-RPC, but wish the protocol had more  
-features, check out SOAP. :-)  
-  
-----  
-!!!4. Common XML-RPC Interfaces  
-  
-Several XML-RPC servers provide built-in methods. These aren't  
-part of XML-RPC itself, but they make handy add-ons.  
-  
-----  
-!!4.1. Introspection: Discovering Server APIs  
-  
-Edd Dumbill proposed  
-the following set of methods:  
-  
-  
-array system.listMethods ()  
-string system.methodHelp (string ''methodName'')  
-array system.methodSignature (string ''methodName'')  
-  
-If a server supports these methods, you can ask it to print out  
-some documentation:  
-  
-  
-import xmlrpclib  
-server = xmlrpclib.Server("http://xmlrpc-c.sourceforge.net/api/sample.php")  
-for method in server.system.listMethods():  
-print method  
-print server.system.methodHelp(method)  
-print  
-  
-These methods are currently supported by servers written in  
-PHP, C and Microsoft .NET. Partial introspection support is included  
-in recent updates to !UserLand Frontier. Introspection support for  
-Perl, Python and Java is available at the XML-RPC  
-Hacks page. Please feel free to add introspection support to  
-other XML-RPC servers!  
-  
-  
-  
-Various client-side tools (documentation generators, wrapper  
-generators, and so on) can be found at the XML-RPC Hacks page as  
-well.  
-  
-----  
-!!4.2. Boxcarring: Sending Multiple Requests at Once  
-  
-If you're writing an XML-RPC client which makes lots of small  
-function calls, you may discover that your round-trip time is fairly  
-high, thanks to Internet backbone latency. Some servers allow you to  
-batch up multiple requests using the following function:  
-  
-  
-array system.multicall (array ''calls'')  
-  
-You can find more information in the system.multicall  
-RFC.  
-  
-  
-  
-This method is currently supported by servers written in C and  
-!UserLand Frontier. Servers written in Python and Perl can use the  
-code at the XML-RPC  
-Hacks page.  
-  
-----  
-!!!5. A Sample API: sumAndDifference  
-  
-To demonstrate XML-RPC, we implement the following API in as many  
-languages as possible.  
-  
-  
-struct sample.sumAndDifference (int ''x'', int ''y'')  
-  
-This function takes two integers as arguments, and returns an  
-XML-RPC `structb containing two elements:  
-  
-  
-  
-  
-  
-; ''sum'':  
-  
-The sum of the two integers.  
-  
-; ''difference'':  
-  
-The difference between the two integers.  
-  
-  
-  
-It's not very useful, but it makes a nice example. :-)  
-  
-  
-  
-This function (and others) are available using the URL  
-http://xmlrpc-c.sourceforge.net/api/sample.php.  
-(This URL won't do anything in a browser; it requires an XML-RPC  
-client.)  
-  
-----  
-!!!6. Using XML-RPC with Perl  
-  
-Ken !MacLeod has implemented XML-RPC for Perl. You can find his  
-Frontier::RPC module at his website or through  
-CPAN.  
-  
-  
-  
-To install Frontier::RPC, download the package and compile  
-it in the standard fashion:  
-  
-  
-bash$ gunzip -c Frontier-RPC-.07b1.tar.gz | tar xvf -  
-bash$ cd Frontier-RPC-.07b1  
-bash$ perl Makefile.PL  
-bash$ make  
-bash$ make test  
-bash$ su -c 'make install'  
-  
-(The process will be slightly different on Windows systems, or if  
-you don't have root access. Consult your Perl documentation for  
-details.)  
-  
-----  
-!!6.1. A Perl Client  
-  
-The following program shows how to call an XML-RPC server from  
-Perl:  
-  
-  
-use Frontier::Client;  
-# Make an object to represent the XML-RPC server.  
-$server_url = 'http://xmlrpc-c.sourceforge.net/api/sample.php';  
-$server = Frontier::Client-bnew(url =b $server_url);  
-# Call the remote server and get our result.  
-$result = $server-bcall('sample.sumAndDifference', 5, 3);  
-$sum = $result-b{'sum'};  
-$difference = $result-b{'difference'};  
-print "Sum: $sum, Difference: $difference\n";----  
-!!6.2. A Stand-Alone Perl Server  
-  
-The following program shows how to write an XML-RPC server in  
-Perl:  
-  
-  
-use Frontier::Daemon;  
-sub sumAndDifference {  
-my ($x, $y) = @_;  
-return {'sum' =b $x + $y, 'difference' =b $x - $y};  
-}  
-# Call me as http://localhost:8080/RPC2  
-$methods = {'sample.sumAndDifference' =b \8sumAndDifference};  
-Frontier::Daemon-bnew(!LocalPort =b 8080, methods =b $methods)  
-or die "Couldn't start HTTP server: $!";----  
-!!6.3. A CGI-Based Perl Server  
-  
-Frontier::RPC2 doesn't provide built-in  
-support for CGI-based servers. It ''does'', however,  
-provide most of the pieces you'll need.  
-  
-  
-  
-Save the following code as  
-sumAndDifference.cgi in your web server's  
-cgi-bin directory. (On Unix systems, you'll need  
-to make it executable by typing chmod +x  
-sumAndDifference.cgi.)  
-  
-  
-#!/usr/bin/perl -w  
-use strict;  
-use Frontier::RPC2;  
-sub sumAndDifference {  
-my ($x, $y) = @_;  
-return {'sum' =b $x + $y, 'difference' =b $x - $y};  
-}  
-process_cgi_call({'sample.sumAndDifference' =b \8sumAndDifference});  
-#==========================================================================  
-# CGI Support  
-#==========================================================================  
-# Simple CGI support for Frontier::RPC2. You can copy this into your CGI  
-# scripts verbatim, or you can package it into a library.  
-# (Based on xmlrpc_cgi.c by Eric Kidd `http://xmlrpc-c.sourceforge.net/b.)  
-# Process a CGI call.  
-sub process_cgi_call ($) {  
-my ($methods) = @_;  
-# Get our CGI request information.  
-my $method = $ENV{'REQUEST_METHOD'};  
-my $type = $ENV{'CONTENT_TYPE'};  
-my $length = $ENV{'CONTENT_LENGTH'};  
-# Perform some sanity checks.  
-http_error(405, "Method Not Allowed") unless $method eq "POST";  
-http_error(400, "Bad Request") unless $type eq "text/xml";  
-http_error(411, "Length Required") unless $length b ;  
-# Fetch our body.  
-my $body;  
-my $count = read STDIN, $body, $length;  
-http_error(400, "Bad Request") unless $count == $length;  
-# Serve our request.  
-my $coder = Frontier::RPC2-bnew;  
-send_xml($coder-bserve($body, $methods));  
-}  
-# Send an HTTP error and exit.  
-sub http_error ($$) {  
-my ($code, $message) = @_;  
-print ``"EOD";  
-Status: $code $message  
-Content-type: text/html  
-`titleb$code $message`/titleb  
-`h1b$code $message`/h1b  
-`pbUnexpected error processing XML-RPC request.`/pb  
-EOD  
-exit ;  
-}  
-# Send an XML document (but don't exit).  
-sub send_xml ($) {  
-my ($xml_string) = @_;  
-my $length = length($xml_string);  
-print ``"EOD";  
-Status: 200 OK  
-Content-type: text/xml  
-Content-length: $length  
-EOD  
-# We want precise control over whitespace here.  
-print $xml_string;  
-}  
-  
-You can copy the utility routines into your own CGI  
-scripts.  
-  
-----  
-!!!7. Using XML-RPC with Python  
-  
-Fredrik Lundh has provided an excellent XML-RPC library for  
-Python.  
-  
-  
-  
-To install, download the latest version. You can either stick the  
-*.py files in the same directory as your Python  
-code, or you can install them in your system's Python directory.  
-  
-  
-  
-!RedHat 6.2 users can type the following:  
-  
-  
-bash$ mkdir xmlrpclib-.9.8  
-bash$ cd xmlrpclib-.9.8  
-bash$ unzip ../xmlrpc-.9.8-990621.zip  
-bash$ python  
-pythonb import xmlrpclib  
-pythonb import xmlrpcserver  
-pythonb __Control-D__  
-bash$ su -c 'cp *.py *.pyc /usr/lib/python1.5/'  
-  
-We import two of the *.py  
-files to trick Python into compiling them. Users of other platforms  
-should consult their Python documentation.  
-  
-  
-  
-For more Python examples, see the article XML-RPC:  
-It Works Both Ways on the O'Reilly Network.  
-  
-----  
-!!7.1. A Python Client  
-  
-The following program shows how to call an XML-RPC server from  
-Python:  
-  
-  
-import xmlrpclib  
-# Create an object to represent our server.  
-server_url = 'http://xmlrpc-c.sourceforge.net/api/sample.php';  
-server = xmlrpclib.Server(server_url);  
-# Call the server and get our result.  
-result = server.sample.sumAndDifference(5, 3)  
-print "Sum:", result [['sum' ]  
-print "Difference:", result[['difference']----  
-!!!8. Using XML-RPC with C and C++  
-  
-To get a copy of XML-RPC for C/C++, see the xmlrpc-c website.  
-  
-  
-  
-You can either download everything in RPM format, or you can  
-build it from source.  
-  
-----  
-!!8.1. A C Client  
-  
-Save the following code in a file called  
-getSumAndDifference.c:  
-  
-  
-#include `stdio.hb  
-#include `xmlrpc.hb  
-#include `xmlrpc_client.hb  
-#define NAME "XML-RPC getSumAndDifference C Client"  
-#define VERSION ".1"  
-#define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php"  
-void die_if_fault_occurred (xmlrpc_env *env)  
-{  
-/* Check our error-handling environment for an XML-RPC fault. */  
-if (env-bfault_occurred) {  
-fprintf(stderr, "XML-RPC Fault: %s (%d)\n",  
-env-bfault_string, env-bfault_code);  
-exit(1);  
-}  
-}  
-int main (int argc, char** argv)  
-{  
-xmlrpc_env env;  
-xmlrpc_value *result;  
-xmlrpc_int32 sum, difference;  
-/* Start up our XML-RPC client library. */  
-xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION);  
-xmlrpc_env_init(8env);  
-/* Call our XML-RPC server. */  
-result = xmlrpc_client_call(8env, SERVER_URL,  
-"sample.sumAndDifference", "(ii)",  
-(xmlrpc_int32) 5,  
-(xmlrpc_int32) 3);  
-die_if_fault_occurred(8env);  
-/* Parse our result value. */  
-xmlrpc_parse_value(8env, result, "{s:i,s:i,*}",  
-"sum", 8sum,  
-"difference", 8difference);  
-die_if_fault_occurred(8env);  
-/* Print out our sum and difference. */  
-printf("Sum: %d, Difference: %d\n", (int) sum, (int) difference);  
-/* Dispose of our result value. */  
-xmlrpc_DECREF(result);  
-/* Shutdown our XML-RPC client library. */  
-xmlrpc_env_clean(8env);  
-xmlrpc_client_cleanup();  
-return ;  
-}  
-  
-To compile it, you can type:  
-  
-  
-bash$ CLIENT_CFLAGS=`xmlrpc-c-config libwww-client --cflags`  
-bash$ CLIENT_LIBS=`xmlrpc-c-config libwww-client --libs`  
-bash$ gcc $CLIENT_CFLAGS -o getSumAndDifference getSumAndDifference.c $CLIENT_LIBS  
-  
-You may need to replace __gcc__ with the name of  
-your system's C compiler.  
-  
-----  
-!!8.2. A C++ Client  
-  
-Save the following code in a file called  
-getSumAndDifference2.cc:  
-  
-  
-#include `iostream.hb  
-#include `!XmlRpcCpp.hb  
-#define NAME "XML-RPC getSumAndDifference C++ Client"  
-#define VERSION ".1"  
-#define SERVER_URL "http://xmlrpc-c.sourceforge.net/api/sample.php"  
-static void get_sum_and_difference () {  
-// Build our parameter array.  
-!XmlRpcValue param_array = !XmlRpcValue::makeArray();  
-param_array.arrayAppendItem(!XmlRpcValue::makeInt(5));  
-param_array.arrayAppendItem(!XmlRpcValue::makeInt(3));  
-// Create an object to resprent the server, and make our call.  
-!XmlRpcClient server (SERVER_URL);  
-!XmlRpcValue result = server.call("sample.sumAndDifference", param_array);  
-// Extract the sum and difference from our struct.  
-!XmlRpcValue::int32 sum = result.structGetValue("sum").getInt();  
-!XmlRpcValue::int32 diff = result.structGetValue("difference").getInt();  
-cout `` "Sum: " `` sum `` ", Difference: " `` diff `` endl;  
-}  
-int main (int argc, char **argv) {  
-// Start up our client library.  
-!XmlRpcClient::Initialize(NAME, VERSION);  
-// Call our client routine, and watch out for faults.  
-try {  
-get_sum_and_difference();  
-} catch (XmlRpcFault8 fault) {  
-cerr `` argv[[] `` ": XML-RPC fault #" `` fault.getFaultCode()  
-`` ": " `` fault.getFaultString() `` endl;  
-!XmlRpcClient::Terminate();  
-exit(1);  
-}  
-// Shut down our client library.  
-!XmlRpcClient::Terminate();  
-return ;  
-}  
-  
-To compile it, you can type:  
-  
-  
-bash$ CLIENT_CFLAGS=`xmlrpc-c-config c++ libwww-client --cflags`  
-bash$ CLIENT_LIBS=`xmlrpc-c-config c++ libwww-client --libs`  
-bash$ c++ $CLIENT_CFLAGS -o getSumAndDifference2 getSumAndDifference2.cc $CLIENT_LIBS  
-  
-You'll need a reasonably modern C++ compiler for this to  
-work.  
-  
-----  
-!!8.3. A C++ Client with Proxy Classes  
-  
-If your XML-RPC server supports the Introspection API,  
-you can automatically generate C++ proxy classes for it. To generate  
-a proxy class, type the following command and save the output to a  
-file:  
-  
-  
-bash$ xml-rpc-api2cpp \  
-b http://xmlrpc-c.sourceforge.net/api/sample.php sample !SampleProxy  
-  
-This will generate a proxy class named  
-!SampleProxy containing wrappers for all the  
-methods beginning with sample. You can edit this  
-class in any fashion you'd like.  
-  
-----  
-!!8.4. A CGI-Based C Server  
-  
-Save the following code in a file called  
-sumAndDifference.c:  
-  
-  
-#include `xmlrpc.hb  
-#include `xmlrpc_cgi.hb  
-xmlrpc_value *  
-sumAndDifference (xmlrpc_env *env, xmlrpc_value *param_array, void *user_data)  
-{  
-xmlrpc_int32 x, y;  
-/* Parse our argument array. */  
-xmlrpc_parse_value(env, param_array, "(ii)", 8x, 8y);  
-if (env-bfault_occurred)  
-return NULL;  
-/* Return our result. */  
-return xmlrpc_build_value(env, "{s:i,s:i}",  
-"sum", x + y,  
-"difference", x - y);  
-}  
-int main (int argc, char **argv)  
-{  
-/* Set up our CGI library. */  
-xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);  
-/* Install our only method (with a method signature and a help string). */  
-xmlrpc_cgi_add_method_w_doc("sample.sumAndDifference",  
-8sumAndDifference, NULL,  
-"S:ii", "Add and subtract two integers.");  
-/* Call the appropriate method. */  
-xmlrpc_cgi_process_call();  
-/* Clean up our CGI library. */  
-xmlrpc_cgi_cleanup();  
-}  
-  
-To compile it, you can type:  
-  
-  
-bash$ CGI_CFLAGS=`xmlrpc-c-config cgi-server --cflags`  
-bash$ CGI_LIBS=`xmlrpc-c-config cgi-server --libs`  
-bash$ gcc $CGI_CFLAGS -o sumAndDifference.cgi sumAndDifference.c $CGI_LIBS  
-  
-Once this is done, copy  
-sumAndDifference.cgi into your webserver's  
-cgi-bin directory.  
-  
-----  
-!!!9. Using XML-RPC with Java  
-  
-Hannes Wallnöfer has provided an excellent  
-implementation of XML-RPC for Java.  
-  
-  
-  
-To install it, download the distribution, unzip it, and add the  
-*.jar files to your CLASSPATH. On a  
-Unix system, you can do this by typing:  
-  
-  
-bash$ unzip xmlrpc-java.zip  
-bash$ cd xmlrpc-java/lib  
-bash$ CLASSPATH=`pwd`/openxml-1.2.jar:`pwd`/xmlrpc.jar:$CLASSPATH----  
-!!9.1. A Java Client  
-  
-Save the following program in a file named  
-!JavaClient.java.  
-  
-  
-import java.util.Vector;  
-import java.util.Hashtable;  
-import helma.xmlrpc.*;  
-public class !JavaClient {  
-// The location of our server.  
-private final static String server_url =  
-"http://xmlrpc-c.sourceforge.net/api/sample.php";  
-public static void main (String [[] args) {  
-try {  
-// Create an object to represent our server.  
-!XmlRpcClient server = new !XmlRpcClient(server_url);  
-// Build our parameter list.  
-Vector params = new Vector();  
-params.addElement(new Integer(5));  
-params.addElement(new Integer(3));  
-// Call the server, and get our result.  
-Hashtable result =  
-(Hashtable) server.execute("sample.sumAndDifference", params);  
-int sum = ((Integer) result.get("sum")).intValue();  
-int difference = ((Integer) result.get("difference")).intValue();  
-// Print out our result.  
-System.out.println("Sum: " + Integer.toString(sum) +  
-", Difference: " +  
-Integer.toString(difference));  
-} catch (!XmlRpcException exception) {  
-System.err.println("!JavaClient: XML-RPC Fault #" +  
-Integer.toString(exception.code) + ": " +  
-exception.toString());  
-} catch (Exception exception) {  
-System.err.println("!JavaClient: " + exception.toString());  
-}  
-}  
-}----  
-!!9.2. A Stand-Alone Java Server  
-  
-Save the following program in a file named  
-!JavaServer.java.  
-  
-  
-import java.util.Hashtable;  
-import helma.xmlrpc.*;  
-public class !JavaServer {  
-public !JavaServer () {  
-// Our handler is a regular Java object. It can have a  
-// constructor and member variables in the ordinary fashion.  
-// Public methods will be exposed to XML-RPC clients.  
-}  
-public Hashtable sumAndDifference (int x, int y) {  
-Hashtable result = new Hashtable();  
-result.put("sum", new Integer(x + y));  
-result.put("difference", new Integer(x - y));  
-return result;  
-}  
-public static void main (String [[] args) {  
-try {  
-// Invoke me as `http://localhost:8080/RPC2b.  
-!WebServer server = new !WebServer(8080);  
-server.addHandler("sample", new !JavaServer());  
-} catch (Exception exception) {  
-System.err.println("!JavaServer: " + exception.toString());  
-}  
-}  
-}----  
-!!!10. Using XML-RPC with PHP  
-  
-Edd Dumbill has implemented XML-RPC for PHP. You can download it  
-from the !UsefulInc XML-RPC  
-website.  
-  
-  
-  
-To install the distribution, decompress it and copy  
-xmlrpc.inc and xmlrpcs.inc  
-into the same directory as your PHP scripts.  
-  
-----  
-!!10.1. A PHP Client  
-  
-The following script shows how to embed XML-RPC calls into a  
-web page.  
-  
-  
-`htmlb  
-`headb  
-`titlebXML-RPC PHP Demo`/titleb  
-`/headb  
-`bodyb  
-`h1bXML-RPC PHP Demo`/h1b  
-`?php  
-include 'xmlrpc.inc';  
-// Make an object to represent our server.  
-$server = new xmlrpc_client('/api/sample.php',  
-'xmlrpc-c.sourceforge.net', 80);  
-// Send a message to the server.  
-$message = new xmlrpcmsg('sample.sumAndDifference',  
-array(new xmlrpcval(5, 'int'),  
-new xmlrpcval(3, 'int')));  
-$result = $server-bsend($message);  
-// Process the response.  
-if (!$result) {  
-print "`pbCould not connect to HTTP server.`/pb";  
-} elseif ($result-bfaultCode()) {  
-print "`pbXML-RPC Fault #" . $result-bfaultCode() . ": " .  
-$result-bfaultString();  
-} else {  
-$struct = $result-bvalue();  
-$sumval = $struct-bstructmem('sum');  
-$sum = $sumval-bscalarval();  
-$differenceval = $struct-bstructmem('difference');  
-$difference = $differenceval-bscalarval();  
-print "`pbSum: " . htmlentities($sum) .  
-", Difference: " . htmlentities($difference) . "`/pb";  
-}  
-?b  
-`/bodyb`/htmlb  
-  
-If your webserver doesn't run PHP scripts, see the PHP website for more  
-information.  
-  
-----  
-!!10.2. A PHP Server  
-  
-The following script shows how to implement an XML-RPC server  
-using PHP.  
-  
-  
-`?php  
-include 'xmlrpc.inc';  
-include 'xmlrpcs.inc';  
-function sumAndDifference ($params) {  
-// Parse our parameters.  
-$xval = $params-bgetParam();  
-$x = $xval-bscalarval();  
-$yval = $params-bgetParam(1);  
-$y = $yval-bscalarval();  
-// Build our response.  
-$struct = array('sum' =b new xmlrpcval($x + $y, 'int'),  
-'difference' =b new xmlrpcval($x - $y, 'int'));  
-return new xmlrpcresp(new xmlrpcval($struct, 'struct'));  
-}  
-// Declare our signature and provide some documentation.  
-// (The PHP server supports remote introspection. Nifty!)  
-$sumAndDifference_sig = array(array('struct', 'int', 'int'));  
-$sumAndDifference_doc = 'Add and subtract two numbers';  
-new xmlrpc_server(array('sample.sumAndDifference' =b  
-array('function' =b 'sumAndDifference',  
-'signature' =b $sumAndDifference_sig,  
-'docstring' =b $sumAndDifference_doc)));  
-?b  
-  
-You would normally invoke this as something like  
-http://localhost/path/sumAndDifference.php.  
-  
-----  
-!!!11. Using XML-RPC with Microsoft .NET  
-  
-Charles Cook is writing an excellent new chapter for this HOWTO.  
-You can find a draft  
-online. If that page disappears, look for a new  
-version of the XML-RPC HOWTO at the Linux Documentation  
-Project.  
-  
-----  
-!!!12. Using XML-RPC with Ruby  
-  
-''(This section of the XML-RPC HOWTO was generously  
-provided by Michael Neumann.)''  
-  
-  
-  
-Ruby is an  
-object-oriented scripting language. It already has a major following in  
-Japan, and it's becoming popular elsewhere.  
-  
-  
-  
-To use XML-RPC with Ruby, you must first install Yoshida Masato's  
-xmlparser module (a wrapper for James Clark's expat parser). This can  
-be found at the Ruby  
-Application Archive.  
-  
-  
-  
-Then, you must install xmlrpc4r  
-using the following commands:  
-  
-  
-bash$ tar -xvzf xmlrpc4r-1_2.tar.gz  
-bash$ cd xmlrpc4r-1_2  
-bash$ su root -c "ruby install.rb"----  
-!!12.1. A Ruby Client  
-  
-Here's a simple Ruby client:  
-  
-  
-require "xmlrpc/client"  
-# Make an object to represent the XML-RPC server.  
-server = XMLRPC::Client.new( "xmlrpc-c.sourceforge.net", "/api/sample.php")  
-# Call the remote server and get our result  
-result = server.call("sample.sumAndDifference", 5, 3)  
-sum = result[["sum"]  
-difference = result[["difference"]  
-puts "Sum: #{sum}, Difference: #{difference}"----  
-!!12.2. A Ruby Server  
-  
-Here's a simple Ruby server:  
-  
-  
-require "xmlrpc/server"  
-s = XMLRPC::CGIServer.new  
-s.add_hanlder("sample.sumAndDifference") do |a,b|  
-{ "sum" =b a + b, "difference" =b a - b }  
-end  
-s.serve  
-  
-This could also have been written as follows:  
-  
-  
-require "xmlrpc/server"  
-s = XMLRPC::CGIServer.new  
-class !MyHandler  
-def sumAndDifference(a, b)  
-{ "sum" =b a + b, "difference" =b a - b }  
-end  
-end  
-s.add_handler("sample", !MyHandler.new)  
-s.serve  
-  
-To run either server in standalone mode, replace the second line  
-of code with the following:  
-  
-  
-s = XMLRPC::Server.new(8080)----  
-!!!13. Using XML-RPC with Proprietary Languages  
-  
-Implementations of XML-RPC are available for the following  
-proprietary programming languages and environments.  
-  
-----  
-!!13.1. Using XML-RPC with K  
-  
-''(This section of the XML-RPC HOWTO was generously  
-provided by Christian Langreiter.)''  
-  
-  
-  
-K is a language used in  
-finance and database development. To install XML-RPC for K, download  
-it from the Kx  
-website. Uncompress and copy the files into the directory in  
-which you keep your .k programs.  
-  
-  
-  
-Here's a short client:  
-  
-  
-\l kxr  
-server:("localhost";"/cgi-bin/sumAndDifference.cgi");  
-.kxr.c[[server;"sumAndDifference";2 3]  
-  
-And here's a server:  
-  
-  
-\l kxrsc  
-.kxr.sm: ,("sumAndDifference";{.((`sum;+/x);(`difference;-/x))})  
-  
-More examples are included in the distribution.  
-  
-----  
-!!!14. Applications with Built-in XML-RPC Support  
-  
-Several popular Linux applications include support for  
-XML-RPC. These have already been described elsewhere, so we mostly  
-provide pointers to articles.  
-  
-----  
-!!14.1. Zope  
-  
-Articles on using XML-RPC with Zope are available elsewhere on  
-the web:  
-  
-  
-  
-  
-  
-  
-****  
-  
-XML-RPC  
-Programming with Zope by Jon Udell  
-  
-  
-****  
-****  
-  
-Zope  
-XML-RPC at !UserLand.Com  
-  
-  
-****----  
-!!14.2. KDE 2.  
-  
-KDE 2.0 includes Kurt Ganroth's kxmlrpc  
-daemon, which allows you to script KDE applications using  
-XML-RPC.  
-  
-  
-  
-Here's a short sample  
-application in Python. It shows you how to connect to  
-kxmlrpc, manipulate your KDE address book, and query the KDE  
-trader.  
-  
-  
-  
-If you have any other articles or example code, please see  
-Section 15.3. We'd like to have more  
-information on scripting KDE.  
-  
-----  
-!!!15. About This Document  
-  
-This document is part of the Linux Documentation  
-Project. Thanks go to Dave Winer and maintainers of all the  
-various XML-RPC libraries.  
-  
-----  
-!!15.1. New Versions of This Document  
-  
-New versions of this document are available at the Linux  
-Documentation Project website.  
-  
-  
-  
-They also provide this manual in alternate formats, including  
-PDF,  
-gzipped  
-HTML and ASCII  
-text.  
-  
-----  
-!!15.2. Contributors to the XML-RPC HOWTO  
-  
-The section on Ruby was contributed by Michael Neumann  
-(neumann AT s-direktnet DOT de). The section on K was contributed by  
-Christian Langreiter (c DOT langreiter AT synerge DOT at).  
-  
-  
-  
-These contributors are all credited at the beginning of their  
-sections.  
-  
-----  
-!!15.3. Submitting Other Snippets  
-  
-If you have a sample client or server in another language or  
-environment, we'd love to include it in this manual. To add a new  
-entry, we need the following information:  
-  
-  
-  
-  
-  
-  
-****  
-  
-The URL of the XML-RPC implementation used.  
-  
-  
-****  
-****  
-  
-Installation instructions.  
-  
-  
-****  
-****  
-  
-A complete, runnable program.  
-  
-  
-****  
-****  
-  
-Compilation instructions, if applicable.  
-  
-  
-****  
-  
-E-mail your example to the xmlrpc-c-devel  
-mailing list or directly to Eric Kidd .  
-  
-  
-  
-Thank you for your help!  
+Describe [HowToXMLRPCHOWTO ] here.