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
/*
* php tapak web Cina contoh demo RESTful
* Perkhidmatan RESTful Kelas
*/
Kelas Tapak {

peribadi
$sites = tatasusunan(
 
=> '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:

实例

<?php
memerlukan_sekali("SiteRestHandler.php");
        
$view "";
if(isset(
$_GET&#91;"view"]))
    
$view  $_GET&#91;"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

<?php
/*
* 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 :

实例

<?php 
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:

restful1.jpg


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

restful2.jpg

Minta tapak php dengan ID 3 (php laman web Cina), alamat akses ialah http://localhost/restexample/site/list/3/,

restful3.jpg

Muat turun kod sumber

Kod yang digunakan dalam contoh boleh dimuat turun dengan mengklik butang di bawah:

Muat turun kod sumber