PHPのRESTful
REST(英語:RESTと呼ばれるのRepresentational State Transferが、)、建築制約と原則のセットを指します。
RESTスタイルのWeb APIの設計は、RESTfulなAPIと呼ばれています。 これは、以下の3つのリソースから定義されています。
- 直感的な簡単なアドレスリソース:URI、例えば:
http://example.com/resources/
。 - 送信リソース:JSON、XML、YAM様:Webサービスなどのインターネットメディアタイプ、のリターンを受け入れます。
- リソースの動作:サポートされているリソースに対する要求のシリーズのWebサービスメソッド(例:POST、GET、PUTまたはDELETE)。
このチュートリアルで私たちは、あなたがこのセクションのコードを使用する記事の終わりにダウンロードすることができ、RESTfulなWebサービスを作成するためにPHP(枠なし)を使用します。
このチュートリアルでは、次のことを学習します。
- RESTfulなWebサービスを作成します。
- ネイティブPHPを使用して、任意のフレームワークに依存しません。
- ルールに従うようにURIパターンをREST。
- RESTfulなサービスが受け入れフォーマットは、というように、JSON、XMLとを返されることがあります。
- 状況に応じて対応を対応するHTTPステータスコード。
- デモは、ヘッダを要求します。
- RESTfulなWebサービスをテストするためにRESTクライアントを使用してください。
RESTfulなWebサービスの例
次のコードは、RESTfulなサービスクラスSite.phpです。
例
/ *
*このチュートリアルでは、RESTfulな例を示しています
* RESTfulなサービスクラス
* /
クラスサイト{
プライベート $部位=配列(
1 => '淘宝網」、
2 => 'Googleの、
3 => 'w3big」、
4 => 'Baiduの'
5 => 'Weibo」、
6 => 'シーナ」
);
パブリック関数getAllSite(){
$これを返す - >サイト。
}
パブリック関数getSite($のID){
$サイト=配列($ ID = >($この- >サイト[ます$ id])$この- >サイト[ます$ id] :? $この- >サイト[1]);
$サイトを返します 。
}
}
?>
RESTfulなサービスのURIマッピング
RESTfulなサービスURIは簡単な視覚的なリソースアドレスに設定する必要があります。 .htaccessのApacheサーバが書き換えルールを対応する設定する必要があります。
この例では、我々は2 URIのルールを使用します。
1、すべてのサイトのリストを取得します:
http://localhost/restexample/site/list/
2、3サイトのIDを取得するには、指定されたサイトは、次のURIのIDを使用して:
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サービスコントローラ
.htaccessファイルでは、我々はRestController.phpは異なる方法に配布する「ビュー」の異なるパラメータを取得することにより、パラメータ'ビュー'を設定することで対応する要求を提出取得します。RestController.phpファイルのコードは次のとおりです。
例
require_onceを (「SiteRestHandler.php ");
$ビュー= "";
(ISSET($ _GET&#の場合 、「ビュー」] 91))
$ビュー= $ _GET&#91 ; "ビュー"&#93 ;;
/ *
* RESTfulなサービス・コントローラー
* URLマッピング
* /
スイッチ ($ビュー){
場合 「すべて」:
//ハンドルREST URL /サイト/リスト/
$ siteRestHandler =新しいSiteRestHandler();
$ siteRestHandler - > getAllSites();
破ります;
ケース 「シングル」:
// REST URL /サイト/ショー/ <ハンドル id>を/
$ siteRestHandler =新しいSiteRestHandler();
$ siteRestHandler - > getSite($ _GET [ "ID"]);
破ります;
ケース "":
// 404 -が見つかりません。
破ります;
}
?>
シンプルなRESTfulな基礎クラス
以下は、HTTPステータスコード、SimpleRest.phpファイルコードの要求に応じて、処理のためのRESTfulな基本クラスを提供し、次のとおりです。
例
/ *
*シンプルなRESTful Webサービスの基本クラス
*私たちは、需要に応じて、このクラスを拡張することができます
* /
クラス SimpleRest {
プライベート$ httpVersion = "HTTP / 1.1 ";
パブリック関数setHttpHeaders($のcontentType、$からstatusCode){
$ statusMessage = $この- > getHttpStatusMessage ($からstatusCode)。
ヘッダ($この- > httpVersion " " $からstatusCode .. "" $ statusMessage ..)。
ヘッダ( "のContent-Type:" 。$のcontentTypeの);
}
パブリック関数getHttpStatusMessage($からstatusCode){
$これらはhttpStatus =配列(
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 => 'のRequest-URIあまりにも長いです」、
415 => 'サポートされていないメディアタイプ」 、
416 => '要求された範囲はありません充足 」、
417 => '期待に失敗しました」、
500 => '内部サーバーエラー」 、
501 => '実装されていません」、
502 => '不正なゲートウェイ」、
503 => 'サービスを使用できません」、
504 => 'ゲートウェイタイムアウト」、
505 => 'HTTPバージョンがサポートされていません ');
リターン($これらはhttpStatus [$からstatusCode] )$これらはhttpStatus [$からstatusCode]:$ステータス[500] ;?
}
}
?>
RESTfulなWebサービス処理クラス
以下は、RESTfulなWebサービス・ハンドラ・クラスSiteRestHandler.phpで、我々はRESTfulな基本クラスを提供する上に、クラスは返されたHTTPステータスコードとデータ形式かどうかを判断するためのリクエストのパラメータによって決定された継承され、我々は3つのデータ・フォーマットの例を示します。 "アプリケーション/ jsonの"、 "アプリケーション/ xmlの"または "text / htmlの":
SiteRestHandler.phpファイルのコードは次のとおりです。
例
require_onceを (「SimpleRest.php ");
require_onceを (「Site.php ");
クラス SiteRestHandlerはSimpleRestを{拡張します
関数 getAllSites(){
$サイト =新しいサイト();
$ RAWDATA = $サイト- > getAllSite ();
場合(空($生データ)) {
$からstatusCode = 404;
$ RAWDATA =配列( 'エラー' => 'が見つかりませんサイト!');
}エルス{
$からstatusCode = 200;
}
$ requestContentType = $ _SERVER [ 'HTTP_ACCEPT '];
$この- > setHttpHeaders($ requestContentType 、$からstatusCode)。
場合(strpos($ requestContentType、「アプリケーション/ JSON ')!== false)の{
$応答= $この- > encodeJson ($生データ);
$応答をエコー 。
}エルス場合(strpos($ requestContentType 、 'text / htmlの')!==偽){
$応答= $この- > encodeHtml ($生データ);
$応答をエコー 。
}エルス(strpos($ requestContentType場合 、「アプリケーション/ xmlの')!==偽){
$応答= $この- > encodeXml ($生データ);
$応答をエコー 。
}
}
パブリック関数encodeHtml($ responseData){
$ htmlResponse = "<テーブルのボーダー= '1'>";
foreachの($として$ responseDataキー= > $値){
.. $ htmlResponse = "<trの > <TD>" $キー"</ TD> <TD>" $値"</ TD> </ TR>" ...;
}
。$ htmlResponse = "</テーブル >";
$ htmlResponseを返します 。
}
パブリック関数encodeJson($ responseData){
$ jsonResponse = json_encode($ responseData) 。
$ jsonResponseを返します 。
}
パブリック関数encodeXml($ responseData){
//オブジェクトを作成したSimpleXMLElement
$のxmlの=新しいのSimpleXMLElement( '<サイト> </サイト> <xmlのバージョン= "1.0"?>');
foreachの($として$ responseDataキー= > $値){
$のxmlの- >はaddChild($キー 、$値);
}
リターンの$のxml - > asXML() ;
}
パブリック関数getSite($のID){
$サイト =新しいサイト();
$ RAWDATA = $サイト- > getSite ($のID);
場合(空($生データ)) {
$からstatusCode = 404;
$ RAWDATA =配列( 'エラー' => 'が見つかりませんサイト!');
}エルス{
$からstatusCode = 200;
}
$ requestContentType = $ _SERVER [ 'HTTP_ACCEPT '];
$この- > setHttpHeaders($ requestContentType 、$からstatusCode)。
場合(strpos($ requestContentType、「アプリケーション/ JSON ')!== false)の{
$応答= $この- > encodeJson ($生データ);
$応答をエコー 。
}エルス場合(strpos($ requestContentType 、 'text / htmlの')!==偽){
$応答= $この- > encodeHtml ($生データ);
$応答をエコー 。
}エルス(strpos($ requestContentType場合 、「アプリケーション/ xmlの')!==偽){
$応答= $この- > encodeXml ($生データ);
$応答をエコー 。
}
}
}
?>
次に我々は、httpを通じて次のように// localhost /をrestexample /サイト/リスト/訪問、出力結果は次のとおりです。
RESTfulなWebサービスクライアント
その後、我々は我々のサービスを要求するには、Google Chromeブラウザの「アドバンスレストクライアント」として、RESTfulなWebサービスクライアントを使用することができます。
リクエストはhttpの例:// localhost /をrestexample /サイト/リスト/アドレス、受信したデータがAcceptと似ています:アプリケーション/ JSON
3要求IDサイトw3big(チュートリアル)、アクセスアドレスはhttp:// localhost /をrestexample /サイト/リスト/ 3 /
ソースのダウンロード
例で使用されるコードは、ダウンロードするには、以下のボタンをクリックします: