RESTなWebサービスを作ってみる
投稿の更新
投稿の更新/取得/削除は、1つのプログラム(edit.php)で行います。更新/取得/削除の判断は、HTTPのメソッド(PUT/GET/DELETE)で行います。
edit.phpの中から、前半部分(更新の処理)を抜き出すと、リスト5のようになります。まず、HTTPのメソッドを、変数「method」に読み込みます(10行目)。その値が「PUT」である時には、データベースから投稿を読み込み(22行目)、内容を更新して(25/26行目)、保存しなおします(27行目)。そして、保存の結果をXMLにします(28~31行目)。−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−【リスト5】投稿の更新(edit.php)?php<br/?//WordPressのAPIを使えるようにするdefine(′WPUSETHEMES′,false);require(′../wp−config.php′);//subfunc.phpを組み込むrequire(′subfunc.php′);//結果用のXMLを生成responseXML = create_response_xml();
// HTTPのメソッドを調べる
method=_SERVER['REQUEST_METHOD'];
// PUTメソッド(投稿の更新)の場合は、
// リクエストとともに送信されたXMLを読み込む
if (method==′PUT′) $requestXML=fetchrequestxml();//URLから投稿のIDを得るpregmatch(′/edit\.php\/(\d∗)/', SERVER[′REQUESTURI′],matches);
id=intval(matches[1]);
// 投稿の編集(PUTメソッドの場合)
if (method == 'PUT') {
// 投稿を読み込むpost = get_post(id); if(post) {
// 投稿のタイトルと内容を更新し、結果をXMLにする
post−>posttitle=requestXML->post_title;
post−>postcontent=requestXML->post_content;
/if (wp_update_post(post)) {responseXML->addChild('status', 1);
responseXML−>addChild(′postid′,id);
responseXML−>addChild(′posttitle′,post->post_title);
responseXML−>addChild(′postcontent′,post->post_content);
}
// 投稿の更新に失敗した場合
else {
responseXML->addChild('status', 0);
}
}
// 投稿を読み込めなかった場合
else {responseXML->addChild('status', 0);
}
}
--------------------------------------------------------------------------------
投稿の取得/削除
投稿の取得/削除も、edit.phpで行います(リスト6)。投稿の更新と同様に、メソッドに応じて必要な処理を行い、その結果をXMLでクライアントに返すようにします。
図3は、このプログラムと連動するためのクライアントの例です。「ID」の欄に投稿のIDを入力し、「投稿を読み込む」のボタンをクリックすると、GETメソッドで通信を行って投稿を取得し、「タイトル」「本文」の欄で編集できるようにしています。
また、タイトルなどを編集して「送信」ボタンをクリックすると、PUTメソッドで通信を行い、WordPressの投稿を更新します。
--------------------------------------------------------------------------------
【リスト6】 投稿の取得/削除
// 投稿の取得(GETメソッドの場合)
elseif (method==′GET′) //投稿を読み込む $post=getpost($id); if($post) //読み込んだ投稿の情報をXMLにする $responseXML−>addChild(′status′,1); $responseXML−>addChild(′postid′,$id); $responseXML−>addChild(′posttitle′,$post−>posttitle); $responseXML−>addChild(′postcontent′,$post−>postcontent); //投稿を読み込めなかった場合 else $responseXML−>addChild(′status′,0); //投稿の削除(DELETEメソッドの場合)elseif(method == 'DELETE') {
// 投稿を削除し、結果をXMLで返す
result=wpdeletepost(id);
responseXML−>addChild(′status′,result ? 1 : 0);
}
header('Content-Type: text/xml; charset=UTF-8');
print $responseXML->asXML();
?>
--------------------------------------------------------------------------------
以上で、今回の目的である、WordPressの投稿を追加/編集/削除するWebサービスが完成しました。サンプル・プログラムのソースコードは、こちらからダウンロードできるようにしておきました。
今回で当連載は終了ですが、いかがだったでしょうか。Webサービスの理解にお役に立てば幸いです。
【参考文献】
『RESTful Webサービス』(Leonard Richardson、Sam Ruby著、山本 陽平監修、株式会社クイープ翻訳)(オライリー・ジャパン発行、発行年:2007)