RESTなWebサービスを作ってみる

2010年1月26日(火)
藤本 壱

投稿の更新

投稿の更新/取得/削除は、1つのプログラム(edit.php)で行います。更新/取得/削除の判断は、HTTPのメソッド(PUT/GET/DELETE)で行います。

edit.phpの中から、前半部分(更新の処理)を抜き出すと、リスト5のようになります。まず、HTTPのメソッドを、変数「$method」に読み込みます(10行目)。その値が「PUT」である時には、データベースから投稿を読み込み(22行目)、内容を更新して(25/26行目)、保存しなおします(27行目)。そして、保存の結果をXMLにします(28~31行目)。
--------------------------------------------------------------------------------
【リスト5】 投稿の更新(edit.php)
// WordPressのAPIを使えるようにする
define('WP_USE_THEMES', 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 = fetch_request_xml();
}
// URLから投稿のIDを得る
preg_match('/edit\.php\/(\d*)$/', $_SERVER['REQUEST_URI'], $matches);
$id = intval($matches[1]);
// 投稿の編集(PUTメソッドの場合)
if ($method == 'PUT') {
    // 投稿を読み込む
    $post = get_post($id);
    if ($post) {
        // 投稿のタイトルと内容を更新し、結果をXMLにする
        $post->post_title = $requestXML->post_title;
        $post->post_content = $requestXML->post_content;
        /if (wp_update_post($post)) {
            $responseXML->addChild('status', 1);
            $responseXML->addChild('post_id', $id);
            $responseXML->addChild('post_title', $post->post_title);
            $responseXML->addChild('post_content', $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 = get_post($id);
    if ($post) {
        // 読み込んだ投稿の情報をXMLにする
        $responseXML->addChild('status', 1);
        $responseXML->addChild('post_id', $id);
        $responseXML->addChild('post_title', $post->post_title);
        $responseXML->addChild('post_content', $post->post_content);
    }
    // 投稿を読み込めなかった場合
    else {
        $responseXML->addChild('status', 0);
    }
}
// 投稿の削除(DELETEメソッドの場合)
elseif ($method == 'DELETE') {
    // 投稿を削除し、結果をXMLで返す
    $result = wp_delete_post($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)

1969年生まれ。神戸大学工学部電子工学科卒。ソフトメーカー勤務後、フリーライターとして独立。現在では、パソコン関係およびマネー関係の書籍を中心に執筆活動を行っている。ブログ「The blog of H.Fujimoto」は、Movable TypeやWordPressの情報を中心に毎日更新している(http://www.h-fj.com/blog/)。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています