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中国語WebサイトRESTfulデモンストレーション例
* RESTfulサービスクラス
*/
クラスサイト{
プライベート $サイト= array(配列(
、、3=> 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]
.htaccess
ファイルで、パラメーター ' を設定することで、RestController.php ファイルに対応するリクエストを取得します。 view' を実行し、'view' を取得します。 ' 異なるパラメータは異なるメソッドに分散されます。 RestController.php ファイルのコードは次のとおりです: 以下は、リクエストに応じて HTTP ステータス コードを処理するための RESTful 基本クラスを提供します。SimpleRest.php ファイル コードは次のとおりです: 以下は、上で提供した RESTful 基本クラスを継承する RESTful Web サービス処理クラスです。このクラスは、リクエスト パラメーターを判断して、返される HTTP ステータス コードとデータ形式を決定します。例 「application/json」、「application/xml」、または「text/html」の 3 つのデータ形式が提供されます: SiteRestHandler.php ファイルのコードは次のとおりです: この例では、http://localhost/restexample/site/list/ アドレスがリクエストされ、受信したデータは次のようになります。 Request the site php (php Chinese website) ) ID 3、アクセスアドレス http://localhost/restexample/site/list/3/ の場合、 ソースコードのダウンロード 例で使用されているコードは、次のボタンをクリックしてダウンロードできます: ソースコードのダウンロードインスタンス
require_once("SiteRestHandler.php");
""
;if(isset( $_GET) [ "view"]))
$view = $_GET
["view"];/* * RESTful サービス コントローラー * URL マッピング */Switch(
$view
){
ケース "all":// process rest rest url/ site/ list/
();シングル "
:// rest rest url/site/show/< id>/ $siteRestHandler->getSite($_GET["id"]);
break;
case "" :
// 404 - 見つかりません;
休憩;
}
?>シンプルな RESTful 基本クラス
Instance
/*
* シンプルな 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 サービス処理クラス
实例
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;
}
}
}
?>