diff --git a/LDP/howto/docbook/XML-RPC-HOWTO.xml b/LDP/howto/docbook/XML-RPC-HOWTO.xml
new file mode 100644
index 00000000..ad7c27a4
--- /dev/null
+++ b/LDP/howto/docbook/XML-RPC-HOWTO.xml
@@ -0,0 +1,1050 @@
+
+
+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.
+">
+
+
+&license;
+">
+
+]]>
+
+
+
+
Legal Notice
+ &license;
+
+">
+
+]>
+
+
+ XML-RPC HOWTO
+
+
+ XML-RPC HOWTO
+
+ 0.5.0, 2001-01-23
+
+
+ Eric
+ Kidd
+
+
+ Source Builders
+ eric.kidd@pobox.com
+
+
+
+
+ 2001
+ Eric Kidd
+
+
+
+ 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 and PHP. Includes sections on Zope and KDE 2.0. Applies to
+ all operating systems with XML-RPC support.
+
+
+ &legal.notice;
+
+
+
+ &legal.section;
+
+
+ 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->new(url => 'http://betty.userland.com/RPC2');
+$name = $server->call('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.)
+
+ python> import xmlrpclib
+python> server = xmlrpclib.Server("http://betty.userland.com/RPC2")
+python> 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.
+
+
+ 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:
+
+ <methodCall>
+ <methodName>sample.sumAndDifference</methodName>
+ <params>
+ <param><value><int>5</int></value></param>
+ <param><value><int>3</int></value></param>
+ </params>
+</methodCall>
+
+ 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.
+
+
+
+
+ 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.
+
+
+
+
+
+
+ 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.
+
+
+
+
+
+ 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.
+
+
+ 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.
+
+
+
+
+ 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.
+
+
+
+
+ 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. :-)
+
+
+
+
+
+
+ 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 <struct> 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 a PHP
+ client.)
+
+
+
+
+ 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-0.07b1.tar.gz | tar xvf -
+bash$ cd Frontier-RPC-0.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.)
+
+
+ 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->new(url => $server_url);
+
+# Call the remote server and get our result.
+$result = $server->call('sample.sumAndDifference', 5, 3);
+$sum = $result->{'sum'};
+$difference = $result->{'difference'};
+
+print "Sum: $sum, Difference: $difference\n";
+
+
+
+
+ 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' => $x + $y, 'difference' => $x - $y};
+}
+
+# Call me as http://localhost:8080/RPC2
+$methods = {'sample.sumAndDifference' => \&sumAndDifference};
+Frontier::Daemon->new(LocalPort => 8080, methods => $methods)
+ or die "Couldn't start HTTP server: $!";
+
+
+
+
+ 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' => $x + $y, 'difference' => $x - $y};
+}
+
+process_cgi_call({'sample.sumAndDifference' => \&sumAndDifference});
+
+
+#==========================================================================
+# 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/>.)
+
+# 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 > 0;
+
+ # 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->new;
+ send_xml($coder->serve($body, $methods));
+}
+
+# Send an HTTP error and exit.
+sub http_error ($$) {
+ my ($code, $message) = @_;
+ print <<"EOD";
+Status: $code $message
+Content-type: text/html
+
+<title>$code $message</title>
+<h1>$code $message</h1>
+<p>Unexpected error processing XML-RPC request.</p>
+EOD
+ exit 0;
+}
+
+# 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.
+
+
+
+
+
+ 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-0.9.8
+bash$ cd xmlrpclib-0.9.8
+bash$ unzip ../xmlrpc-0.9.8-990621.zip
+bash$ python
+python> import xmlrpclib
+python> import xmlrpcserver
+python> 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.
+
+
+ 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']
+
+
+
+
+
+ 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.
+
+
+ A C Client
+
+ Save the following code in a file called
+ getSumAndDifference.c:
+
+ #include <stdio.h>
+#include <xmlrpc.h>
+#include <xmlrpc_client.h>
+
+#define NAME "XML-RPC getSumAndDifference C Client"
+#define VERSION "0.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->fault_occurred) {
+ fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
+ env->fault_string, env->fault_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(&env);
+
+ /* Call our XML-RPC server. */
+ result = xmlrpc_client_call(&env, SERVER_URL,
+ "sample.sumAndDifference", "(ii)",
+ (xmlrpc_int32) 5,
+ (xmlrpc_int32) 3);
+ die_if_fault_occurred(&env);
+
+ /* Parse our result value. */
+ xmlrpc_parse_value(&env, result, "{s:i,s:i,*}",
+ "sum", &sum,
+ "difference", &difference);
+ die_if_fault_occurred(&env);
+
+ /* 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(&env);
+ xmlrpc_client_cleanup();
+
+ return 0;
+}
+
+ 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.
+
+
+
+
+ A C++ Client
+
+ Save the following code in a file called
+ getSumAndDifference2.cc:
+
+ #include <iostream.h>
+#include <XmlRpcCpp.h>
+
+#define NAME "XML-RPC getSumAndDifference C++ Client"
+#define VERSION "0.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 (XmlRpcFault& fault) {
+ cerr << argv[0] << ": XML-RPC fault #" << fault.getFaultCode()
+ << ": " << fault.getFaultString() << endl;
+ XmlRpcClient::Terminate();
+ exit(1);
+ }
+
+ // Shut down our client library.
+ XmlRpcClient::Terminate();
+ return 0;
+}
+
+ 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.
+
+
+
+
+ A CGI-Based C Server
+
+ Save the following code in a file called
+ sumAndDifference.c:
+
+ #include <xmlrpc.h>
+#include <xmlrpc_cgi.h>
+
+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)", &x, &y);
+ if (env->fault_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. */
+ xmlrpc_cgi_add_method("sample.sumAndDifference", &sumAndDifference, NULL);
+
+ /* 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.
+
+
+
+
+
+ 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
+
+
+ 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());
+ }
+ }
+}
+
+
+
+
+ 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/RPC2>.
+ WebServer server = new WebServer(8080);
+ server.addHandler("sample", new JavaServer());
+
+ } catch (Exception exception) {
+ System.err.println("JavaServer: " + exception.toString());
+ }
+ }
+}
+
+
+
+
+
+
+ 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.
+
+
+ A PHP Client
+
+ The following script shows how to embed XML-RPC calls into a
+ web page.
+
+ <html>
+<head>
+<title>XML-RPC PHP Demo</title>
+</head>
+<body>
+<h1>XML-RPC PHP Demo</h1>
+
+<?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->send($message);
+
+// Process the response.
+if (!$result) {
+ print "<p>Could not connect to HTTP server.</p>";
+} elseif ($result->faultCode()) {
+ print "<p>XML-RPC Fault #" . $result->faultCode() . ": " .
+ $result->faultString();
+} else {
+ $struct = $result->value();
+ $sumval = $struct->structmem('sum');
+ $sum = $sumval->scalarval();
+ $differenceval = $struct->structmem('difference');
+ $difference = $differenceval->scalarval();
+ print "<p>Sum: " . htmlentities($sum) .
+ ", Difference: " . htmlentities($difference) . "</p>";
+}
+?>
+
+</body></html>
+
+ If your webserver doesn't run PHP scripts, see the PHP website for more
+ information.
+
+
+
+
+ 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->getParam(0);
+ $x = $xval->scalarval();
+ $yval = $params->getParam(1);
+ $y = $yval->scalarval();
+
+ // Build our response.
+ $struct = array('sum' => new xmlrpcval($x + $y, 'int'),
+ 'difference' => 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' =>
+ array('function' => 'sumAndDifference',
+ 'signature' => $sumAndDifference_sig,
+ 'docstring' => $sumAndDifference_doc)));
+?>
+
+ You would normally invoke this as something like
+ http://localhost/path/sumAndDifference.php.
+
+
+
+
+
+ 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.
+
+
+ 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
+
+
+
+
+
+
+ KDE 2.0
+
+ 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
+ . We'd like to have more
+ information on scripting KDE.
+
+
+
+
+
+
+ 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.
+
+
+ New Versions of This Document
+
+ New versions of this document are available at the XML-RPC for C/C++
+ website.
+
+ You can also find reasonably up-to-date versions at the Linux Documentation
+ Project. They also provide this manual in alternate formats,
+ including tarballs and PDF.
+
+
+
+ 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!
+
+
+
+
+