サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

PHP における XML-RPC について入門してみる

はじめに

試験勉強です。

XML-RPC については、マニュアルがとても心細いので勉強するのもたいへんです。

こちらこちら を参考に、できるだけ簡単なスニペットにしてみました。

XML-RPC サーバー側プログラムの簡単な例。

<?php
// 参考:http://www.java-samples.com/showtutorial.php?tutorialid=1186
function lifecycle($method, $params)
{
    switch($params[0]) {
        case 'egg':
            $reply = 'All eggs will be birds one day.';
            break;
        default:
            $reply = 'That must have been an otheregg';
    }
    return $reply;
}

$server = xmlrpc_server_create();

xmlrpc_server_register_method(
        $server,
        "cycle" /* 外部に公開するメソッド名 */,
        "lifecycle" /* 公開する実際のメソッド名称 */ );

$request = file_get_contents("php://input");

$method = null;

// {{
$dbg  = xmlrpc_decode_request($request, $method);
$desc = xmlrpc_parse_method_descriptions($request);
// }}

$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');

print ($response);

xmlrpc_server_destroy($server);

XML-RPC クライアント側プログラムの簡単な例。

<?php
// 参考:https://gist.github.com/quietshu/8fd50b1f732b87025762
function do_call($host, $port, $uri, $request) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,               "http://$host:$port/$uri");
    curl_setopt($ch, CURLOPT_HEADER,            0);
    curl_setopt($ch, CURLOPT_POST,              true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,        $request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,    true);

    $response       = curl_exec($ch);
    $response_code  = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curl_errorno   = curl_errno($ch);
    $curl_error     = curl_error($ch);
    curl_close($ch);

    // curl のエラーを確認する
    if ($curl_errorno != 0) {
        die("Curl Error: $curl_errorno - $curl_error\n");
    }

    // サーバーからのエラーを確認する
    if ($response_code != 200) {
        die("ERROR: non-200 response from server: $response_code - $response\n");
    }
    $decoded = xmlrpc_decode($response);

    // XMLRPC のエラーを確認する
    if (is_array($decoded) && xmlrpc_is_fault($decoded)) {
        die("FAULT: {$decoded['faultString']} - {$decoded['faultCode']}");
    }
    return $decoded;
}
//

$host = 'www.example.com';
$port = 80;
$uri    = '/path/to/xmlrpcsv.php';
$request  = xmlrpc_encode_request('cycle', 'egg');

$response = do_call($host, $port, $uri, $request);
var_dump($response);

関連するマニュアル

使用した関数

サーバー側

クライアント側