PHP RESTful
REST (Bahasa Inggeris: Representational State Transfer, dirujuk sebagai REST) merujuk kepada satu set kekangan dan prinsip seni bina.
API Web yang mematuhi gaya reka bentuk REST dipanggil RESTful API. Ia ditakrifkan daripada tiga aspek sumber berikut:
Alamat sumber intuitif dan pendek: URI, seperti:
http://example.com/resources/
.Sumber dihantar: Jenis media Internet diterima dan dikembalikan oleh perkhidmatan web, seperti: JSON, XML, YAM, dsb.
Operasi pada sumber: satu siri kaedah permintaan yang disokong oleh perkhidmatan web pada sumber (seperti: POST, GET, PUT atau DELETE).
Dalam tutorial ini kami akan menggunakan PHP (tanpa rangka kerja) untuk mencipta perkhidmatan web RESTful Pada akhir artikel, anda boleh memuat turun kod yang digunakan dalam bab ini.
Melalui tutorial ini anda akan mempelajari perkara berikut:
Buat Perkhidmatan Web RESTful.
Menggunakan PHP asli dan tidak bergantung pada sebarang rangka kerja.
Corak URI perlu mengikut peraturan REST.
Format yang diterima dan dikembalikan oleh perkhidmatan RESTful boleh menjadi JSON, XML, dsb.
Balas kepada kod status HTTP yang sepadan mengikut situasi yang berbeza.
Menunjukkan penggunaan pengepala permintaan.
Gunakan klien REST untuk menguji perkhidmatan web RESTful.
Instance Perkhidmatan Web RESTful
Kod berikut ialah kelas perkhidmatan RESTful Site.php:
Instance
/*
* php tapak web Cina contoh demo RESTful
* Perkhidmatan RESTful Kelas
*/
Kelas Tapak {
peribadi $sites = tatasusunan(
1 => 'TaoBao',
2 => php', 🎜> 5
=> 'Weibo' , 6
=> >'Sina' );
awam fungsi getAllSite(){ kembalikan $this
->tapak; }
fungsi awam getSite($id){
$id){ $site 🎜>= array($id => ($this->tapak [$id]) ? $ini->tapak[$id] : $ini->tapak[
1]); kembali
$site
; } }
Pemetaan URI Perkhidmatan RESTful
URI Perkhidmatan RESTful hendaklah ditetapkan kepada alamat sumber yang intuitif dan pendek. .htaccess pelayan Apache harus mempunyai peraturan Tulis Semula yang sepadan ditetapkan.
Dalam contoh ini kita akan menggunakan dua peraturan URI:
1 Dapatkan senarai semua tapak:
http://localhost/restexample/site/list/
2 URI berikut adalah untuk mendapatkan id Untuk tapak dengan 3:
http://localhost/restexample/site/list/3/
peraturan konfigurasi fail .htaccess projek adalah seperti berikut:
# 开启 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 Service Controller
Dalam fail .htaccess, kami mendapat permintaan yang sepadan dalam fail RestController.php dengan menetapkan parameter 'view' dan mengedarkannya kepada kaedah yang berbeza dengan mendapatkan parameter 'view' yang berbeza '. RestController.php Kod fail adalah seperti berikut:
实例
memerlukan_sekali("SiteRestHandler.php");
$view = "";
if(isset($_GET["view"]))
$view = $_GET["view"];
/*
* Perkhidmatan REHAT 控制器
* URL 映射
*/
suis($view){
kes "semua"< . 🎜 >();
$siteRestHandler
->getAllSites(); > kes
"single": // 处理 REST Url /site/show/🎜 / >$siteRestHandler
= baharu
SiteRestHandler(); $siteRestHandler->getSite($_GET[<> 🎜>"id"]); rehat;
kes
"" : < //404 - tidak ditemui;
rehat;
}
?>
Kelas asas RESTful Mudah
Berikut menyediakan kelas asas RESTful untuk memproses kod status HTTP sebagai tindak balas kepada permintaan SimpleRest.php kod fail adalah seperti berikut:
.Instance
/*
* Kelas asas perkhidmatan web RESTful yang ringkas
* Kami boleh melanjutkan keperluan berdasarkan kelas ini
*/
kelas SimpleRest {
peribadi $httpVersion = "HTTP/1.1";
fungsi awam setHttpHeaders($contentType, $statusCode){
$statusMessage <🎜 = $ini -> getHttpStatusMessage($statusCode);
header($this->httpVersion. " ". $statusMessage); header("Jenis-Kandungan:" . 🎜>$contentType); }
fungsi awam getHttpStatusMessage($statusCode){ $httpStatus = array(
100 => '🎜>'Teruskan >,
101 => 'Switching Protocols', ><🎜 <
=> 'OK', 201
=> C ', 202 =>
'Diterima'<🎜 🎜>203 => 'Maklumat Tidak Berwibawa',
203 'Tiada Kandungan',
205 => '>'<🎜 🎜>,
206 => 'Sebahagian Kandungan', 0
=> 'Berbilang Pilihan', 301 => 'Dipindahkan Secara Tetap',
302 => 'Ditemui',
303 => 'Lihat Lain-lain',
304 => 'Tidak Diubah Suai',
305 => 'Gunakan Proksi',
306 => '(Tidak digunakan)',
307 => 'Ubah Hala Sementara',
400 => 'Permintaan Tidak Baik',
401 => 'Tidak Dibenarkan',
402 => 'Pembayaran Diperlukan',
403 => 'Dilarang',
404 => 'Tidak Dijumpai',
405 => 'Kaedah Tidak Dibenarkan',
406 => 'Tidak Diterima',
407 => 'Pengesahan Proksi Diperlukan',
408 => 'Permintaan Tamat masa',
409 => 'Konflik',
410 => 'Hilang',
411 => 'Panjang Diperlukan',
412 => 'Prasyarat Gagal',
413 => 'Minta Entiti Terlalu Besar',
414 => 'Permintaan-URI Terlalu Panjang',
415 => 'Jenis Media Tidak Disokong',
416 => 'Julat Diminta Tidak Memuaskan',
417 => 'Jangkaan Gagal',
500 => 'Ralat Pelayan Dalaman',
501 => 'Tidak Dilaksanakan',
502 => 'Bad Gateway',
503 => 'Perkhidmatan Tidak Tersedia',
504 => 'Tamat Masa Gerbang',
505 => 'Versi HTTP Tidak Disokong');
return ($httpStatus[$status >]) ? $httpStatus[$statusCode] : $status[500]; }
}
?>
Kelas pemprosesan Perkhidmatan Web RESTful
Berikut ialah kelas pemprosesan Perkhidmatan Web RESTful SiteRestHandler.php, yang mewarisi kelas asas RESTful yang kami sediakan di atas Dalam kelas, kod status HTTP yang dikembalikan ditentukan dengan menilai parameter permintaan dan format data Dalam contoh, kami menyediakan tiga format data: "application/json", "application/xml" atau "text/html":
SiteRestHandler.php Kod fail adalah seperti berikut :
实例
memerlukan_sekali("SimpleRest.php");
memerlukan_sekali("Site.php");
kelas SiteRestHandler dilanjutkan SimpleRest {
fungsi getAllSites() {
<🎜 <🎜 🎜>= baharu Tapak(); $rawData
= $tapak 🎜>->getAllSite(); jika(kosong($rawData
)) { $statusCode
= 404; <🎜 = array('ralat'
=> 'Tiada tapak ditemui!'); } lain { $statusCode = 200
<🎜 > > ><🎜 > >
$requestContentType = $_SERVER[
'HTTP_ACCEPT'
]; $ini ->setHttpHeaders($requestContentType, > 🎜>$statusCode);
jika(
strpos((ypermintaan,><🎜) 🎜>'application/json') !== palsu){
$respons ><🎜 🎜>= $this->encodeJson($rawData); echo $response
; } lain jika(strpos
>Content(🎜 >,'teks/html') !== salah){ $response =
$this->encodeHtml($rawData); echo $response;
} lain jika(strposstrpos
<🎜 🎜>$requestContentType,'application/xml') !== palsu){ $respons = $ini->encodeXml($rawData);
gema $response;
}
fungsi
encodeHtml($responseData) {
$htmlResponse >"<table border='1'>"; foreach($responseData
sebagai $ kunci=>$value) { $htmlResponse
.>< 🎜>.>< >"<tr><td>". $key. "</td><td>". $nilai. "</td></tr>"; } $htmlRespons >
"</table>"; return $htmlResponse;
} fungsi awam encodeJson($responseData) {
$jsonResponse ><=🎜 json_encode($responseData); return
$jsonResponse<🎜;><🎜 } fungsi awam
encodeXml
($responseData) >// 创建 SimpleXMLElement 对象 $xml
= baharu
SimpleXMLElement'(lt version="1.0"?><site></site>'); foreach($responseData sebagai $key
=>$value) { $xml<🎜;<🎜;<🎜 🎜>addChild
($key, $value); } return $xml->asXML
(); } < asXML(); } < public> >fungsi
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'];
$ini ->setHttpHeaders($requestContentType, > 🎜>$statusCode);
jika(
strpos((ypermintaan,><🎜) 🎜>'application/json') !== palsu){
$respons ><🎜 🎜>= $this->encodeJson($rawData); echo $response
; } lain jika(strpos
>Content(🎜 >,'teks/html') !== salah){ $response =
$this->encodeHtml($rawData); echo $response;
} lain jika(strposstrpos
<🎜 🎜>$requestContentType,'application/xml') !== palsu){ $response = $this->encodeXml($rawData);
echo $response;
}
}
}
?>
Seterusnya kami mengakses melalui http://localhost/restexample/site/list/, hasil output adalah seperti berikut:
Perkhidmatan Web RESTful Pelanggan
Seterusnya kami boleh menggunakan "Advance Rest Client" penyemak imbas Google Chrome sebagai pelanggan Perkhidmatan Web RESTful untuk meminta perkhidmatan kami.
Minta alamat http://localhost/restexample/site/list/ dalam contoh, dan data yang diterima adalah serupa dengan Accept: application/json
Minta tapak php dengan ID 3 (php laman web Cina), alamat akses ialah http://localhost/restexample/site/list/3/,
Muat turun kod sumber
Kod yang digunakan dalam contoh boleh dimuat turun dengan mengklik butang di bawah:
Muat turun kod sumber