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 Webサービスを作成する。

  • ネイティブ PHP を使用し、フレームワークに依存しません。

  • URI パターンは REST ルールに従う必要があります。

  • RESTful サービスは、JSON、XML などの形式を受け入れて返します。

  • さまざまな状況に応じて、対応するHTTPステータスコードに応答します。

  • リクエストヘッダーの使用法を示します。

  • REST クライアントを使用して RESTful Web サービスをテストします。


RESTful Webサービスインスタンス

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

インスタンス

<?php
/*
* php中国語WebサイトRESTfulデモンストレーション例
* RESTfulサービスクラス
*/
クラスサイト{

プライベート
$サイト= array(配列(
3=&gt;    public function getSite($id){

$site = array($id => () $this->サイト [$id]) ? $this->サイト[$id] : $this-> サイト[ 1]);
戻る
$site;
}
}
?>

RESTful サービス URI マッピング

RESTful サービス URI は、直感的で短いリソース アドレスに設定する必要があります。 Apache サーバーの .htaccess には、対応する書き換えルール セットが必要です。

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

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

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

2. ID を使用して、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= [nc,qsa]

RESTful Web サービス コントローラー

.htaccess

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

インスタンス

<?php
require_once("SiteRestHandler.php");
""
;if(isset( $_GET) &#91; "view"]))
$view = $_GET
&#91;"view"];/* * RESTful サービス コントローラー * URL マッピング */Switch(

$view

){
ケース "all"// process rest rest url/ site/ list/
();シングル "
// rest rest url/site/show/&lt; id&gt;/        $siteRestHandler->getSite($_GET["id"]);
break;

case
"" :
// 404 - 見つかりません;
休憩;
}
?>

シンプルな RESTful 基本クラス

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

Instance

<?php
/*
* シンプルな RESTful Web サービス基本クラス
* このクラスに基づいてニーズを拡張できます
*/
class SimpleRest {

プライベート
$httpVersion= "HTTP/1.1";

パブリック関数
setHttpHeaders($contentType, $statusCode ){

= $this -> getHttpStatusMessage($statusCode); (
$this
->httpVersion. " "$ステータスコード." ".$statusMessage); ("Content-Type:".$contentType ); }
パブリック関数 getHttpStatusMessage( $ステータスコード){        $httpStatus = array(
100 => '続行',
101 => 「プロトコルの切り替え」
200 =>「OK」,
201 => 「作成しました」
202 => 「承認されました」
203 => 「非権限情報」
204 => 「コンテンツなし」
205 => 「コンテンツをリセット」 ,
206 => 「コンテンツの一部」
300 => 「複数の選択肢」            
301 => 「永久に移動しました」,
302 => 「見つかりました」
303 => 「その他」を見る,
304 => 「変更されていません」
305 => 「プロキシを使用する」
306 => '(未使用)',
307 => 「一時リダイレクト」
400 => 「不正なリクエスト」
401 => 「不正」
402 => 「支払いが必要です」
            
403 => 「禁止」
404 => 「見つかりません」
405 => 「許可されていないメソッド」
406 => 「受け入れられません」
407 => 「プロキシ認証が必要です」,
408 => 「リクエストタイムアウト」
409 => 「対立」
410 => 「逝ってしまった」
411 => 「長さ必須」
412 => 「前提条件が失敗しました」
            
413 => 「リクエストエンティティが大きすぎます」
414 => 「リクエスト URI が長すぎます」,
415 => 「サポートされていないメディア タイプ」,
416 => 「要求された範囲は満足できません」,
417 => 「期待は失敗しました」,
500 => 「内部サーバー エラー」,
501 => 「実装されていません」
502 => 「不正なゲートウェイ」
503 => 「サービスが利用できません」
504 => 「ゲートウェイタイムアウト」
            
505 => 'HTTP バージョンはサポートされていません');
return (
$httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
}
}
?>

RESTful Web サービス処理クラス

以下は、上で提供した RESTful 基本クラスを継承する RESTful Web サービス処理クラスです。このクラスは、リクエスト パラメーターを判断して、返される HTTP ステータス コードとデータ形式を決定します。例 「application/json」、「application/xml」、または「text/html」の 3 つのデータ形式が提供されます:

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

实例

<?php
require_once("SimpleRest.php");
require_once(
"Site.php");

クラス
SiteRestHandler を拡張しますSimpleRest {

function
getAllSites() {

$site = 新しい サイト ();
$rawData = $site- >getAllSite();

if(empty(
$rawData)) {
$statusCode = 404 ;
$rawData = array( 'エラー' => 'サイトが見つかりません!' );        
} else {
$statusCode = 200;
}

$requestContentType = $_SERVER['HTTP_ACCEPT'];
        
$this->setHttpHeaders($requestContentType, $statusCode);

if(
strpos($requestContentType,' application/json') !== false){
$response = $this->encodeJson( $rawData);
エコー
$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 ;
}
}

パブリック関数
encodeHtml ($responseData) {

$htmlResponse = "<table border='1'>";
for each(
$responseData as $ key=>$value) {
$htmlResponse .= "<tr><td>"$キー。 「</td><td>」。 $価値。 "</td></tr>";
}
$htmlResponse .= "</table>";
return
$htmlResponse;        
}

    public function
encodeJson($responseData) {
$jsonResponse = json_encode($responseData );
return
$jsonResponse;        
}

public function
encodeXml($responseData) {
// 创建 SimpleXMLElement 对象
$xml = 新しい SimpleXMLElement('<?xml version="1.0"?><site></site>');
foreach(
$responseData as $key=>$value) {
$xml->addChild($key, $value);
}
return
$xml ->asXML() ;
}

パブリック 関数
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);
エコー
$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;
}
}
}
?>
RESTful Webサービスクライアント

次に、Google Chromeブラウザの「Advance Rest Client」をRESTful Webサービスクライアントとして使用できます。当社のサービスをリクエストするため。

restful1.jpgこの例では、http://localhost/restexample/site/list/ アドレスがリクエストされ、受信したデータは次のようになります。

Accept: application/json

Request the site php (php Chinese website) ) ID 3、アクセスアドレス http://localhost/restexample/site/list/3/ の場合、

restful2.jpgソースコードのダウンロード

例で使用されているコードは、次のボタンをクリックしてダウンロードできます:

ソースコードのダウンロードrestful3.jpg