Subversion-Projekte lars-tiefland.codeigniter

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
<head>
4
 
5
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
<title>XML-RPC and XML-RPC Server Classes : CodeIgniter User Guide</title>
7
 
8
<style type='text/css' media='all'>@import url('../userguide.css');</style>
9
<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />
10
 
11
<script type="text/javascript" src="../nav/nav.js"></script>
12
<script type="text/javascript" src="../nav/prototype.lite.js"></script>
13
<script type="text/javascript" src="../nav/moo.fx.js"></script>
14
<script type="text/javascript" src="../nav/user_guide_menu.js"></script>
15
 
16
<meta http-equiv='expires' content='-1' />
17
<meta http-equiv= 'pragma' content='no-cache' />
18
<meta name='robots' content='all' />
19
<meta name='author' content='ExpressionEngine Dev Team' />
20
<meta name='description' content='CodeIgniter User Guide' />
21
 
22
</head>
23
<body>
24
 
25
<!-- START NAVIGATION -->
26
<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
27
<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div>
28
<div id="masthead">
29
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
30
<tr>
31
<td><h1>CodeIgniter User Guide Version 1.7.1</h1></td>
32
<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td>
33
</tr>
34
</table>
35
</div>
36
<!-- END NAVIGATION -->
37
 
38
 
39
<!-- START BREADCRUMB -->
40
<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
41
<tr>
42
<td id="breadcrumb">
43
<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp;
44
<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp;
45
XML-RPC and XML-RPC Server Classes
46
</td>
47
<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td>
48
</tr>
49
</table>
50
<!-- END BREADCRUMB -->
51
 
52
<br clear="all" />
53
 
54
 
55
<!-- START CONTENT -->
56
<div id="content">
57
 
58
 
59
<h1>XML-RPC and XML-RPC Server Classes</h1>
60
 
61
 
62
<p>CodeIgniter's XML-RPC classes permit you to send requests to another server, or set up
63
your own XML-RPC server to receive requests.</p>
64
 
65
 
66
<h2>What is XML-RPC?</h2>
67
 
68
<p>Quite simply it is a way for two computers to communicate over the internet using XML.
69
One computer, which we will call the <dfn>client</dfn>, sends an XML-RPC <strong>request</strong> to
70
another computer, which we will call the <dfn>server</dfn>.  Once the server receives and processes the request it
71
will send back a <strong>response</strong> to the client.</p>
72
 
73
<p>For example, using the MetaWeblog API, an XML-RPC Client (usually a desktop publishing tool) will
74
send a request to an XML-RPC Server running on your site.  This request might be a new weblog entry
75
being sent for publication, or it could be a request for an existing entry for editing.
76
 
77
When the XML-RPC Server receives this request it will examine it to determine which class/method should be called to process the request.
78
Once processed, the server will then send back a response message.</p>
79
 
80
<p>For detailed specifications, you can visit the <a href="http://www.xmlrpc.com/">XML-RPC</a> site.</p>
81
 
82
<h2>Initializing the Class</h2>
83
 
84
<p>Like most other classes in CodeIgniter, the XML-RPC and XML-RPCS classes are initialized in your controller using the <dfn>$this->load->library</dfn> function:</p>
85
 
86
<p>To load the XML-RPC class you will use:</p>
87
<code>$this->load->library('xmlrpc');</code>
88
<p>Once loaded, the xml-rpc library object will be available using: <dfn>$this->xmlrpc</dfn></p>
89
 
90
<p>To load the XML-RPC Server class you will use:</p>
91
<code>
92
$this->load->library('xmlrpc');<br />
93
$this->load->library('xmlrpcs');
94
</code>
95
<p>Once loaded, the xml-rpcs library object will be available using: <dfn>$this->xmlrpcs</dfn></p>
96
 
97
<p class="important"><strong>Note:</strong>&nbsp; When using the XML-RPC Server class you must load BOTH the XML-RPC class and the XML-RPC Server class.</p>
98
 
99
 
100
 
101
<h2>Sending XML-RPC Requests</h2>
102
 
103
<p>To send a request to an XML-RPC server you must specify the following information:</p>
104
 
105
<ul>
106
<li>The URL of the server</li>
107
<li>The method on the server you wish to call</li>
108
<li>The <em>request</em> data (explained below).</li>
109
</ul>
110
 
111
<p>Here is a basic example that sends a simple Weblogs.com ping to the <a href="http://pingomatic.com/">Ping-o-Matic</a></p>
112
 
113
 
114
<code>$this->load->library('xmlrpc');<br />
115
<br />
116
$this->xmlrpc->server('http://rpc.pingomatic.com/', 80);<br />
117
$this->xmlrpc->method('weblogUpdates.ping');<br />
118
 
119
<br />
120
$request = array('My Photoblog', 'http://www.my-site.com/photoblog/');<br />
121
$this->xmlrpc->request($request);<br />
122
<br />
123
if ( ! $this->xmlrpc->send_request())<br />
124
{<br />
125
&nbsp;&nbsp;&nbsp;&nbsp;echo $this-&gt;xmlrpc->display_error();<br />
126
}</code>
127
 
128
<h3>Explanation</h3>
129
 
130
<p>The above code initializes the XML-RPC class, sets the server URL and method to be called (weblogUpdates.ping).  The
131
request (in this case, the title and URL of your site) is placed into an array for transportation, and
132
compiled using the request() function.
133
Lastly, the full request is sent.  If the <dfn>send_request()</dfn> method returns false we will display the error message
134
sent back from the XML-RPC Server.</p>
135
 
136
<h2>Anatomy of a Request</h2>
137
 
138
<p>An XML-RPC <dfn>request</dfn> is simply the data you are sending to the XML-RPC server.  Each piece of data in a request
139
is referred to as a <dfn>request parameter</dfn>.  The above example has two parameters:
140
The URL and title of your site. When the XML-RPC server receives your request, it will look for parameters it requires.</p>
141
 
142
<p>Request parameters must be placed into an array for transportation, and each parameter can be one
143
of seven data types (strings, numbers, dates, etc.). If your parameters are something other than strings
144
you will have to include the data type in the request array.</p>
145
 
146
<p>Here is an example of a simple array with three parameters:</p>
147
 
148
<code>$request = array('John', 'Doe', 'www.some-site.com');<br />
149
$this->xmlrpc->request($request);</code>
150
 
151
<p>If you use data types other than strings, or if you have several different data types, you will place
152
each parameter into its own array, with the data type in the second position:</p>
153
 
154
<code>
155
$request = array (<br />
156
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('John', 'string'),<br />
157
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('Doe', 'string'),<br />
158
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(FALSE, 'boolean'),<br />
159
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(12345, 'int')<br />
160
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
161
<br />
162
$this->xmlrpc->request($request);</code>
163
 
164
The  <a href="#datatypes">Data Types</a>  section below has a full list of data types.
165
 
166
 
167
 
168
<h2>Creating an XML-RPC Server</h2>
169
 
170
<p>An XML-RPC Server acts as a traffic cop of sorts, waiting for incoming requests and redirecting them to the
171
appropriate functions for processing.</p>
172
 
173
<p>To create your own XML-RPC server involves initializing the XML-RPC Server class in your controller where you expect the incoming
174
request to appear, then setting up an array with mapping instructions so that incoming requests can be sent to the appropriate
175
class and method for processing.</p>
176
 
177
<p>Here is an example to illustrate:</p>
178
 
179
<code>
180
$this->load->library('xmlrpc');<br />
181
$this->load->library('xmlrpcs');<br />
182
<br />
183
$config['functions']['<var>new_post</var>'] = array('function' => '<dfn>My_blog.new_entry</dfn>'),<br />
184
$config['functions']['<var>update_post</var>'] = array('function' => '<dfn>My_blog.update_entry</dfn>');<br />
185
$config['object'] = $this;<br />
186
<br />
187
$this->xmlrpcs->initialize($config);<br />
188
$this->xmlrpcs->serve();</code>
189
 
190
<p>The above example contains an array specifying two method requests that the Server allows.
191
The allowed methods are on the left side of the array. When either of those are received, they will be mapped to the class and method on the right.</p>
192
 
193
<p>The '<var>object</var>' key is a special key that you pass an instantiated class object with, which is necessary when the method you are mapping to is not
194
	part of the CodeIgniter super object.</p>
195
 
196
<p>In other words, if an XML-RPC Client sends a request for the <var>new_post</var> method, your
197
server will load the <dfn>My_blog</dfn> class and call the <dfn>new_entry</dfn> function.
198
If the request is for the <var>update_post</var> method, your
199
server will load the <dfn>My_blog</dfn> class and call the <dfn>update_entry</dfn> function.</p>
200
 
201
<p>The function names in the above example are arbitrary.  You'll decide what they should be called on your server,
202
or if you are using standardized APIs, like the Blogger or MetaWeblog API, you'll use their function names.</p>
203
 
204
<h2>Processing Server Requests</h2>
205
 
206
<p>When the XML-RPC Server receives a request and loads the class/method for processing, it will pass
207
an object to that method containing the data sent by the client.</p>
208
 
209
<p>Using the above example, if the <var>new_post</var> method is requested, the server will expect a class
210
to exist with this prototype:</p>
211
 
212
<code>class <kbd>My_blog</kbd> extends Controller {<br />
213
<br />
214
&nbsp;&nbsp;&nbsp;&nbsp;function <kbd>new_post</kbd>(<var>$request</var>)<br />
215
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
216
	<br />
217
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
218
}
219
</code>
220
 
221
<p>The <var>$request</var> variable is an object compiled by the Server, which contains the data sent by the XML-RPC Client.
222
Using this object you will have access to the <em>request parameters</em> enabling you to process the request.  When
223
you are done you will send a <dfn>Response</dfn> back to the Client.</p>
224
 
225
<p>Below is a real-world example, using the Blogger API.  One of the methods in the Blogger API is <dfn>getUserInfo()</dfn>.
226
Using this method, an XML-RPC Client can send the Server a username and password, in return the Server sends
227
back information about that particular user (nickname, user ID, email address, etc.).  Here is how the processing
228
function might look:</p>
229
 
230
 
231
<code>class <kbd>My_blog</kbd> extends Controller {<br />
232
<br />
233
&nbsp;&nbsp;&nbsp;&nbsp;function <kbd>getUserInfo</kbd>(<var>$request</var>)<br />
234
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
235
 
236
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$username = 'smitty';<br />
237
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$password = 'secretsmittypass';<br /><br />
238
 
239
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->library('xmlrpc');<br />
240
&nbsp;&nbsp;&nbsp;&nbsp;<br />
241
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parameters&nbsp;=&nbsp;$request->output_parameters();<br />
242
&nbsp;&nbsp;&nbsp;&nbsp;<br />
243
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($parameters['1'] != $username AND $parameters['2'] != $password)<br />
244
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
245
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this->xmlrpc->send_error_message('100',&nbsp;'Invalid&nbsp;Access');<br />
246
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
247
&nbsp;&nbsp;&nbsp;&nbsp;<br />
248
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response&nbsp;=&nbsp;array(array('nickname'&nbsp;&nbsp;=>&nbsp;array('Smitty','string'),<br />
249
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'userid'&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;array('99','string'),<br />
250
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'url'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;array('http://yoursite.com','string'),<br />
251
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'email'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;array('jsmith@yoursite.com','string'),<br />
252
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'lastname'&nbsp;&nbsp;=>&nbsp;array('Smith','string'),<br />
253
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'firstname'&nbsp;=>&nbsp;array('John','string')<br />
254
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br />
255
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct');<br />
256
<br />
257
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this->xmlrpc->send_response($response);<br />
258
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
259
}
260
</code>
261
 
262
<h3>Notes:</h3>
263
<p>The <dfn>output_parameters()</dfn> function retrieves an indexed array corresponding to the request parameters sent by the client.
264
In the above example, the output parameters will be the username and password.</p>
265
 
266
<p>If the username and password sent by the client were not valid, and error message is returned using <dfn>send_error_message()</dfn>.</p>
267
 
268
<p>If the operation was successful, the client will be sent back a response array containing the user's info.</p>
269
 
270
 
271
<h2>Formatting a Response</h2>
272
 
273
<p>Similar to <em>Requests</em>, <em>Responses</em> must be formatted as an array.  However, unlike requests, a response is an array
274
<strong>that contains a single item</strong>.  This item can be an array with several additional arrays, but there
275
can be only one primary array index.  In other words, the basic prototype is this:</p>
276
 
277
<code>$response = array('Response data',  'array');</code>
278
 
279
<p>Responses, however, usually contain multiple pieces of information. In order to accomplish this we must put the response into its own
280
array so that the primary array continues to contain a single piece of data.  Here's an example showing how this might be accomplished:</p>
281
 
282
<code>
283
$response = array (<br />
284
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br />
285
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'first_name' => array('John', 'string'),<br />
286
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'last_name' => array('Doe', 'string'),<br />
287
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'member_id' => array(123435, 'int'),<br />
288
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'todo_list' => array(array('clean house', 'call mom', 'water plants'), 'array'),<br />
289
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br />
290
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct'<br />
291
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
292
</code>
293
 
294
<p class="important">Notice that the above array is formatted as a <dfn>struct</dfn>.  This is the most common data type for responses.</p>
295
 
296
<p>As with Requests, a response can be one of the seven data types listed in the  <a href="#datatypes">Data Types</a>  section.</p>
297
 
298
 
299
<h2>Sending an Error Response</h2>
300
 
301
<p>If you need to send the client an error response you will use the following:</p>
302
 
303
<code>return $this->xmlrpc->send_error_message('123', 'Requested data not available');</code>
304
 
305
<p>The first parameter is the error number while the second parameter is the error message.</p>
306
 
307
 
308
 
309
 
310
 
311
 
312
<h2>Creating Your Own Client and Server</h2>
313
 
314
<p>To help you understand everything we've covered thus far, let's create a couple controllers that act as
315
XML-RPC Client and Server.  You'll use the Client to send a request to the Server and receive a response.</p>
316
 
317
<h3>The Client</h3>
318
 
319
<p>Using a text editor, create a controller called <dfn>xmlrpc_client.php</dfn>.
320
In it, place this code and save it to your <samp>applications/controllers/</samp> folder:</p>
321
 
322
<textarea class="textarea" style="width:100%" cols="50" rows="32">&lt;?php
323
 
324
class Xmlrpc_client extends Controller {
325
 
326
	function index()
327
	{
328
		$this->load->helper('url');
329
		$server_url = site_url('xmlrpc_server');
330
 
331
		$this->load->library('xmlrpc');
332
 
333
		$this->xmlrpc->server($server_url, 80);
334
		$this->xmlrpc->method('Greetings');
335
 
336
		$request = array('How is it going?');
337
		$this->xmlrpc->request($request);
338
 
339
		if ( ! $this->xmlrpc->send_request())
340
		{
341
			echo $this->xmlrpc->display_error();
342
		}
343
		else
344
		{
345
			echo '<pre>';
346
			print_r($this->xmlrpc->display_response());
347
			echo '</pre>';
348
		}
349
	}
350
}
351
?></textarea>
352
 
353
<p>Note: In the above code we are using a "url helper".  You can find more information in the <a href="../general/helpers.html">Helpers Functions</a> page.</p>
354
 
355
<h3>The Server</h3>
356
 
357
<p>Using a text editor, create a controller called <dfn>xmlrpc_server.php</dfn>.
358
In it, place this code and save it to your <samp>applications/controllers/</samp> folder:</p>
359
 
360
<textarea class="textarea" style="width:100%" cols="50" rows="30">&lt;?php
361
 
362
class Xmlrpc_server extends Controller {
363
 
364
	function index()
365
	{
366
		$this->load->library('xmlrpc');
367
		$this->load->library('xmlrpcs');
368
 
369
		$config['functions']['Greetings'] = array('function' => 'Xmlrpc_server.process');
370
 
371
		$this->xmlrpcs->initialize($config);
372
		$this->xmlrpcs->serve();
373
	}
374
 
375
 
376
	function process($request)
377
	{
378
		$parameters = $request->output_parameters();
379
 
380
		$response = array(
381
							array(
382
									'you_said'  => $parameters['0'],
383
									'i_respond' => 'Not bad at all.'),
384
							'struct');
385
 
386
		return $this->xmlrpc->send_response($response);
387
	}
388
}
389
?></textarea>
390
 
391
<h3>Try it!</h3>
392
 
393
<p>Now visit the your site using a URL similar to this:</p>
394
<code>example.com/index.php/<var>xmlrpc_client</var>/</code>
395
 
396
<p>You should now see the message you sent to the server, and its response back to you.</p>
397
 
398
<p>The client you created sends a message ("How's is going?") to the server, along with a request for the "Greetings" method.
399
The Server receives the request and maps it to the "process" function, where a response is sent back.</p>
400
 
401
<h2>Using Associative Arrays In a Request Parameter</h2>
402
 
403
<p>If you wish to use an associative array in your method parameters you will need to use a struct datatype:</p>
404
 
405
<code>$request = array(<br />
406
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br />
407
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Param 0<br />
408
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br />
409
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'=&gt;'John'<br />
410
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	),<br />
411
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct'<br />
412
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br />
413
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br />
414
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Param 1<br />
415
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br />
416
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	'size'=&gt;'large',<br />
417
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'shape'=&gt;'round'<br />
418
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;	),<br />
419
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct'<br />
420
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
421
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
422
	$this-&gt;xmlrpc-&gt;request($request);</code>
423
 
424
<p>You can retrieve the associative array when processing the request in the Server.</p>
425
 
426
<code>$parameters = $request-&gt;output_parameters();<br />
427
	$name = $parameters['0']['name'];<br />
428
	$size = $parameters['1']['size'];<br />
429
	$size = $parameters['1']['shape']; </code>
430
 
431
<h1>XML-RPC Function Reference</h1>
432
 
433
<h2>$this->xmlrpc->server()</h2>
434
<p>Sets the URL and port number of the server to which a request is to be sent:</p>
435
<code>$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);</code>
436
 
437
<h2>$this->xmlrpc->timeout()</h2>
438
<p>Set a time out period (in seconds) after which the request will be canceled:</p>
439
<code>$this->xmlrpc->timeout(6);</code>
440
 
441
<h2>$this->xmlrpc->method()</h2>
442
<p>Sets the method that will be requested from the XML-RPC server:</p>
443
<code>$this->xmlrpc->method('<var>method</var>');</code>
444
 
445
<p>Where <var>method</var> is the name of the method.</p>
446
 
447
<h2>$this->xmlrpc->request()</h2>
448
<p>Takes an array of data and builds request to be sent to XML-RPC server:</p>
449
<code>$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/');<br />
450
$this->xmlrpc->request($request);</code>
451
 
452
<h2>$this->xmlrpc->send_request()</h2>
453
<p>The request sending function.  Returns boolean TRUE or FALSE based on success for failure, enabling it to be used conditionally.</p>
454
 
455
<h2>$this->xmlrpc->set_debug(TRUE);</h2>
456
<p>Enables debugging, which will display a variety of information and error data helpful during development.</p>
457
 
458
 
459
<h2>$this->xmlrpc->display_error()</h2>
460
<p>Returns an error message as a string if your request failed for some reason.</p>
461
<code>echo $this->xmlrpc->display_error();</code>
462
 
463
<h2>$this->xmlrpc->display_response()</h2>
464
<p>Returns the response from the remote server once request is received.  The response will typically be an associative array.</p>
465
<code>$this->xmlrpc->display_response();</code>
466
 
467
<h2>$this->xmlrpc->send_error_message()</h2>
468
<p>This function lets you send an error message from your server to the client. First parameter is the error number while the second parameter
469
is the error message.</p>
470
<code>return $this->xmlrpc->send_error_message('123', 'Requested data not available');</code>
471
 
472
<h2>$this->xmlrpc->send_response()</h2>
473
<p>Lets you send the response from your server to the client. An array of valid data values must be sent with this method.</p>
474
<code>$response = array(<br />
475
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br />
476
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'flerror' => array(FALSE, 'boolean'),<br />
477
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'message' => "Thanks for the ping!")<br />
478
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
479
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct');<br />
480
return $this->xmlrpc->send_response($response);</code>
481
 
482
 
483
<a name="datatypes"></a>
484
<h2>Data Types</h2>
485
 
486
<p>According to the <a href="http://www.xmlrpc.com/spec">XML-RPC spec</a> there are seven types
487
of values that you can send via XML-RPC:</p>
488
 
489
<ul>
490
<li><em>int</em> or <em>i4</em></li>
491
<li><em>boolean</em></li>
492
<li><em>string</em></li>
493
<li><em>double</em></li>
494
<li><em>dateTime.iso8601</em></li>
495
<li><em>base64</em></li>
496
<li><em>struct</em> (contains array of values)</li>
497
<li><em>array</em> (contains array of values)</li>
498
</ul>
499
 
500
 
501
</div>
502
<!-- END CONTENT -->
503
 
504
 
505
<div id="footer">
506
<p>
507
Previous Topic:&nbsp;&nbsp;<a href="user_agent.html">User Agent Class</a>
508
&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
509
<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
510
<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
511
Next Topic:&nbsp;&nbsp;<a href="zip.html">Zip Encoding Class</a>
512
</p>
513
<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006-2008 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">Ellislab, Inc.</a></p>
514
</div>
515
 
516
</body>
517
</html>