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
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"];
switch($view){
case "all":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getAllSites();
break;
case "single":
$siteRestHandler = new SiteRestHandler();
$siteRestHandler->getSite($_GET["id"]);
break;
case "" :
break;
}
?>
シンプルな RESTful 基本クラス
以下に、リクエストに応答してHTTPステータスコードを処理するためのRESTfulの基本クラスを提供します。SimpleRest.phpファイルのコードは次のとおりです:
例
<?php
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) {
$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/ です。

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