PHP RESTful

REST(英語:Representational State Transfer、略称REST)とは、一連のアーキテクチャ上の制約条件と原則を指します。

REST設計スタイルに適合するWeb APIはRESTful APIと呼ばれます。リソースは以下の3つの側面から定義されます:

  • 直感的で簡潔なリソースアドレス:URI、例:http://example.com/resources/。
  • 転送されるリソース:Webサービスが受け入れ、返すインターネットメディアタイプ、例:JSON、XML、YAMなど。
  • リソースに対する操作:Webサービスがそのリソース上でサポートする一連のリクエストメソッド(例:POST、GET、PUT、DELETE)。

このチュートリアルでは、PHP(フレームワーク不使用)を使用してRESTful Webサービスを作成します。記事の最後で、この章で使用したコードをダウンロードできます。

このチュートリアルを通じて、以下の内容を学ぶことができます:

  • RESTful Webserviceを作成します。
  • ネイティブPHPを使用し、いかなるフレームワークにも依存しません。
  • URIパターンはRESTルールに従う必要があります。
  • RESTfulサービスが受け入れ、返す形式は、JSON、XMLなどにすることができます。
  • 状況に応じて、対応するHTTPステータスコードを返します。
  • リクエストヘッダーの使用法を示します。
  • RESTクライアントを使用してRESTful Webサービスをテストします。

RESTful Webservice の例

以下のコードはRESTfulサービスクラスですSite.php:

例

<?php /** サンプル RESTful デモ例 * RESTful サービスクラス*/ Class Site { private $sites = array( 1 => 'TaoBao', 2 => 'Google', 3 => 'サンプル', 4 => 'Baidu', 5 => 'Weibo', 6 => 'Sina' ); public function getAllSite(){ return $this->sites; } public function getSite($id){ $site = array($id => ($this->sites[$id]) ? $this->sites[$id] : $this->sites[1]); return $site; } } ?>

RESTful Services URI マッピング

RESTful Services URIは、直感的で簡潔なリソースアドレスに設定する必要があります。Apacheサーバーの .htaccess には、対応するRewriteルールを設定しておく必要があります。

この例では、2つのURIルールを使用します。

1. すべてのサイトリストを取得:

http://localhost/restexample/site/list/

2. idを使用して指定のサイトを取得します。次のURIはidが3のサイトを取得するものです:

http://localhost/restexample/site/list/3/

プロジェクトの .htaccessファイル設定ルールは次のとおりです:

# 开启 rewrite 功能
Options +FollowSymlinks
RewriteEngine on

# 重写规则
RewriteRule ^site/list/$   RestController.php?view=all [nc,qsa]
RewriteRule ^site/list/([0-9]+)/$   RestController.php?view=single&id=$1 [nc,qsa]

RESTful Web Service コントローラ

に.htaccessこのファイルでは、パラメータ 'view' を設定して RestController.php ファイル内の対応するリクエストを取得し、'view' のさまざまなパラメータを取得することで、異なるメソッドに振り分けます。RestController.php ファイルのコードは次のとおりです:

例

<?php require_once("SiteRestHandler.php"); $view = ""; if(isset($_GET["view"])) $view = $_GET["view"]; /** RESTful service コントローラ * URL マッピング*/ switch($view){ case "all": //REST URL /site/list/ を処理する $siteRestHandler = new SiteRestHandler(); $siteRestHandler->getAllSites(); break; case "single": //REST URL /site/show/<id>/ を処理する $siteRestHandler = new SiteRestHandler(); $siteRestHandler->getSite($_GET["id"]); break; case "" : //404 - not found; break; } ?>

シンプルな RESTful 基本クラス

以下に、リクエストに応答してHTTPステータスコードを処理するためのRESTfulの基本クラスを提供します。SimpleRest.phpファイルのコードは次のとおりです:

例

<?php /** シンプルな RESTful web services 基本クラス * このクラスに基づいて要件を拡張できます*/ class SimpleRest { private $httpVersion = "HTTP/1.1"; public function setHttpHeaders($contentType, $statusCode){ $statusMessage = $this -> getHttpStatusMessage($statusCode); header($this->httpVersion. " ". $statusCode ." ". $statusMessage); header("Content-Type:". $contentType); } public function getHttpStatusMessage($statusCode){ $httpStatus = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => '(Unused)', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported'); return ($httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500]; } } ?>

RESTful Web Service 処理クラス

以下は、RESTful Web Service 処理クラス SiteRestHandler.php です。上記で提供したRESTful基本クラスを継承し、クラス内でリクエストのパラメータを判定して、返すHTTPステータスコードとデータ形式を決定します。この例では、3つのデータ形式 "application/json"、"application/xml"、"text/html" を提供しています。

SiteRestHandler.phpファイルのコードは次のとおりです:

例

<?php require_once("SimpleRest.php"); require_once("Site.php"); class SiteRestHandler extends SimpleRest { function getAllSites() { $site = new Site(); $rawData = $site->getAllSite(); if(empty($rawData)) { $statusCode = 404; $rawData = array('error' => 'No sites found!'); } else { $statusCode = 200; } $requestContentType = $_SERVER['HTTP_ACCEPT']; $this ->setHttpHeaders($requestContentType, $statusCode); if(strpos($requestContentType,'application/json') !== false){ $response = $this->encodeJson($rawData); echo $response; } else if(strpos($requestContentType,'text/html') !== false){ $response = $this->encodeHtml($rawData); echo $response; } else if(strpos($requestContentType,'application/xml') !== false){ $response = $this->encodeXml($rawData); echo $response; } } public function encodeHtml($responseData) { $htmlResponse = "<table border='1'>"; foreach($responseData as $key=>$value) { $htmlResponse .= "<tr><td>". $key. "</td><td>". $value. "</td></tr>"; } $htmlResponse .= "</table>"; return $htmlResponse; } public function encodeJson($responseData) { $jsonResponse = json_encode($responseData); return $jsonResponse; } public function encodeXml($responseData) { //SimpleXMLElement オブジェクトを作成する $xml = new SimpleXMLElement('<?xml version="1.0"?><site></site>'); foreach($responseData as $key=>$value) { $xml->addChild($key, $value); } return $xml->asXML(); } public function getSite($id) { $site = new Site(); $rawData = $site->getSite($id); if(empty($rawData)) { $statusCode = 404; $rawData = array('error' => 'No sites found!'); } else { $statusCode = 200; } $requestContentType = $_SERVER['HTTP_ACCEPT']; $this ->setHttpHeaders($requestContentType, $statusCode); if(strpos($requestContentType,'application/json') !== false){ $response = $this->encodeJson($rawData); echo $response; } else if(strpos($requestContentType,'text/html') !== false){ $response = $this->encodeHtml($rawData); echo $response; } else if(strpos($requestContentType,'application/xml') !== false){ $response = $this->encodeXml($rawData); echo $response; } } } ?>

次に、http://localhost/restexample/site/list/ にアクセスすると、出力結果は次のようになります:


RESTful Web Service クライアント

次に、Google Chrome ブラウザの "Advance Rest Client" をRESTful Web Serviceクライアントとして使用して、私たちのサービスにリクエストを送信できます。

この例では、http://localhost/restexample/site/list/ アドレスにリクエストを送信し、受信するデータは次のようになります:Accept: application/json

idが3のサイト サンプル(サンプル) にリクエストを送信します。アクセスアドレスは http://localhost/restexample/site/list/3/ です。

ソースコードのダウンロード

この例で使用したコードは、以下のボタンをクリックしてダウンロードできます:

ソースコードのダウンロード

その他の拡張