« IE7β | メイン | iTMSに中島みゆき »
2006年02月03日
xml-rpcをphpで実装
仕事で作っているサイトにxml-rpcを実装することが急務になってきたので、本格的に勉強しはじめました。
Webでxml-rpcを検索すると、phpへの実装はpearを利用するか、XML-RPC for PHP等の外部モジュールを使った例ばかりです。確かにプログラムするにはそのほうが楽かもしれないのですが、これだと自分がどのようなxmlを送信しているのかわかりにくい上に、pearやモジュールの読み込み自体でプログラムが重くなる(小規模サイトなら構わないのですが、ワタクシが作っているサイトは1日のPVが30万)ために、必要な部分だけを自分でプログラムすることにしました。
xml-rpcの仕様自体がxmlをPOST送信してxmlを受信するというシンプルな構造であるため、phpの組み込み関数のみでこの機能を実装することはそう難しいことではありません。
参考文献としては以前も紹介した、
自分で作る blog ツール 石川 直人 by G-Tools |
参考文献でお気づきのようにxml-rpcは、いわゆる“ブログ”の中核をなす技術でもあります。――例えば更新pingやトラックバック(通常トラックバックはxmlは使用せずに文字列を単純にpostしているだけです)といったブログ独自の機能はxml-rpcを利用しています
テストとして、郵便専門ネットをXML-RPCで活用する - 郵便専門ネットのxml-rpcサーバーを利用しました。郵便番号から住所を検索するサイトです。このサイトをxml-rpc利用する実例としては、個人情報入力フォームなどで、郵便番号を入力するだけで該当する町名まで自動入力するという場合に、プログラム上でこのサーバーに接続して住所を検索すれば、自分のサイトで膨大な郵便番号データベースを持つ必要がなくなります。
以下のサンプルプログラムで、郵便番号から住所検索します(デフォルトで入力されている「1631480」はアップルコンピュータ株式会社の郵便番号)。表示は生のxmlですので、実際の運用時にはxmlをパースする必要があります。
※当然のことならがら、郵便番号から住所をピンポイントで特定できるのは登録されている一部の法人のみです。
サンプルプログラム
この程度ならば、以下のようなシンプルなプログラムで実現できます。
f_sendxml()という関数が実際にxmlをpostするプログラムで、第一引数にpostするxml、第二引数に送信先urlを指定します。
サンプルプログラムソース
<?php
$postto = 'http://yubin.senmon.net/service/xmlrpc/';
if(is_numeric($_POST['postcode']) && 7 == strlen($_POST['postcode'])){
$postxml = '<' . '?xml version="1.0" encoding="utf-8" ?' .'>' . "\n";
$postxml .= <<<EOM
<methodCall>
<methodName>yubin.fetchAddressByPostcode</methodName>
<params>
<param>
<value>${_POST['postcode']}</value>
</param>
</params>
</methodCall>
EOM;
$returndata = f_sendxml($postxml,$postto);
header("Content-Type: text/xml; charset=UTF-8");
print $returndata;
}else{
print "引数が不正です";
}
function f_sendxml($postxml,$postto){
$xml_length = strlen($postxml);
$ch = curl_init($postto);
$urlinfo = parse_url($postto);
$header = 'POST ' . $urlinfo['path'] . ' HTTP/1.1' . "\r\n";
$header .= 'HOST: ' . $urlinfo['host'] . "\n\r";
$header .= 'Content-Type: text/xml; charset=UTF-8' . "\r\n";
$header .= 'Content-Length: ' . $xml_length . "\r\n";
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header."\r\n" .$postxml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$returndata = curl_exec($ch);
curl_close($ch);
return $returndata;
}
?>
投稿者 Utayume : 2006年02月03日 22:56| 05 Work(Perl, PHP, etc)
AD
トラックバック
このエントリーのトラックバックURL:
http://ondes-martenot.info/MT/mt-tb.cgi/625