XML-RPC
Specification: http://xmlrpc.scripting.com/spec.html
PHP Documentation: http://php.net/manual/en/book.xmlrpc.php
WordPress Documentation: http://codex.wordpress.org/XML-RPC_Support
Mimic (JS Library): http://mimic-xmlrpc.sourceforge.net/
Example Extension
<?php
/*
* Plugin Name: XML-RPC Extensibility Demo for WordCamp OC
* Description: Demonstrates how to add an XML-RPC endpoint
* Author: Mike Adams, Automattic
* License: GPL2+
*/
/**
* XML-RPC Method: Get the email address for the given user
*
* Requires Authentication, but demo only. Does not do the correct
* things with permissions, etc.
*
* @param (array) $args XML-RPC Request args:
* 0 => username
* 1 => password
* 2 => user_id for the user whose email address we want
* @return (string|IXR_Error) Email address or IXR_Error on failure
*/
function user_email_rpc( $args ) {
global $wp_xmlrpc_server;
if ( !is_array( $args ) || 3 != count( $args ) ) {
return new IXR_Error( 400, 'Bad input' );
}
// Best practice: Explicitly cast all inputs
$username = (string) $args[0];
$password = (string) $args[1];
$user_id = (int) $args[2];
if ( !$wp_xmlrpc_server->login( $username, $password ) ) {
return $wp_xmlrpc_server->error;
}
$user = get_user_by( 'id', $user_id );
if ( !$user || is_wp_error( $user ) ) {
return new IXR_Error( 404, 'Unknown user_id' );
}
// Best practice: Explicitly cast all output
return (string) $user->user_email;
}
function user_email_rpc_add_xmlrpc_method( $methods ) {
$methods['napa.getUserEmail'] = 'user_email_rpc';
return $methods;
}
add_filter( 'xmlrpc_methods', 'user_email_rpc_add_xmlrpc_method' );
XML-RPC via CLI “Example”
Generating and reading XML from the command line is annoying. It’s not really worth it.
#!/bin/bash
URL=${1-http://mdawaffe.wordpress.com/xmlrpc.php}
echo "COMMAND:"
echo "curl -i -H 'Content-Type: text/xml' --data '<?xml version="'"1.0"'"?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>' '$URL'"
echo
echo "RESPONSE:"
curl -i -H 'Content-Type: text/xml' --data '<?xml version="1.0&"?><methodCall><methodName>demo.sayHello</methodName><params></params></methodCall>' "$URL"
echo
XML-RPC via PHP Example: xmlrpc_encode_request()
PHP’s xmlrpc_encode_request() and xmlrpc_decode() make it easy.
<?php
// Default XML-RPC endpoint
$xmlrpc_endpoint = isset( $argv[1] )
? $argv[1]
: 'http://mdawaffe.wordpress.com/xmlrpc.php';
// What method to call?
$method_name = 'demo.sayHello';
// What arguments to pass?
$method_arguments = null;
// Generate Request XML
$request = xmlrpc_encode_request(
$method_name,
$method_arguments,
array( 'encoding' => 'UTF-8' )
);
echo "METHOD NAME:\n";
echo "$method_name\n\n";
echo "METHOD ARGUMENTS:\n";
var_dump( $method_arguments );
echo "\n";
echo "REQUEST:\n";
echo "$request\n";
// Do HTTP POST
$context = stream_context_create( array( 'http' => array(
'method' => 'POST',
'header' => 'Content-Type: text/xml',
'content' => $request,
'ignore_errors' => true,
) ) );
$response = file_get_contents( $xmlrpc_endpoint, false, $context );
echo "RESPONSE:\n";
echo "$response\n";
// Decode Response XML
$decoded = xmlrpc_decode( $response, 'UTF-8' );
if ( is_array( $decoded ) && xmlrpc_is_fault( $decoded ) ) {
echo "RESPONSE ERROR CODE:\n";
echo $decoded['faultCode'];
echo "\n\n";
echo "RESPONSE ERROR MESSAGE:\n";
echo $decoded['faultString'];
echo "\n\n";
} else {
echo "DECODED RESPONSE:\n";
var_dump( $decoded );
echo "\n";
}
XML-RPC via WordPress Example: WP_HTTP_IXR_Client
WordPress’ WP_HTTP_IXR_Client makes it even easier.
<?php
// Load WordPress
require 'path/to/wordpress/wp-load.php';
// Load base IXR classes
require ABSPATH . WPINC . '/class-IXR.php';
// Load WP_HTTP_IXR_Client class
require ABSPATH . WPINC . '/class-wp-http-ixr-client.php';
$xmlrpc_endpoint = isset( $argv[1] )
? $argv[1]
: 'http://mdawaffe.wordpress.com/xmlrpc.php';
// What method to call?
$method_name = 'demo.addTwoNumbers';
// What arguments to pass?
$method_arguments = array( 1, 3 );
echo "METHOD NAME:\n";
echo "$method_name\n\n";
echo "METHOD ARGUMENTS:\n";
var_dump( $method_arguments );
echo "\n";
$xml_rpc_client = new WP_HTTP_IXR_Client( $xmlrpc_endpoint );
$xml_rpc_client->query( $method_name, $method_arguments );
if ( $xml_rpc_client->isError() ) {
echo "RESPONSE ERROR CODE:\n";
echo $xml_rpc_client->getErrorCode();
echo "\n\n";
echo "RESPONSE ERROR MESSAGE:\n";
echo $xml_rpc_client->getErrorMessage();
echo "\n\n";
} else {
echo "DECODED RESPONSE:\n";
var_dump( $xml_rpc_client->getResponse() );
echo "\n";
}
Pingback: WordCamp OC: REST/JSON API Slides | real ultimate waffe (.net)
Pingback: mdawaffe: WordCamp OC: REST/JSON API Slides | WordPress Planet