PHP RESTful


REST(영어: Representational State Transfer, REST라고도 함)는 일련의 아키텍처 제약 조건과 원칙을 의미합니다.

REST 디자인 스타일을 따르는 웹 API를 RESTful API라고 합니다. 이는 리소스의 다음 세 가지 측면에서 정의됩니다.

  • 직관적이고 짧은 리소스 주소: URI(예: http://example.com/resources/).

  • 전송된 리소스: JSON, XML, YAM 등과 같이 웹 서비스에서 허용하고 반환하는 인터넷 미디어 유형입니다.

  • 리소스에 대한 작업: 이 리소스에 대한 웹 서비스에서 지원하는 일련의 요청 방법(예: POST, GET, PUT 또는 DELETE).

이 튜토리얼에서는 PHP(프레임워크 없이)를 사용하여 RESTful 웹 서비스를 만듭니다. 이 기사의 마지막 부분에서 이 장에 사용된 코드를 다운로드할 수 있습니다.

이 튜토리얼을 통해 다음 내용을 배울 수 있습니다.

  • RESTful 웹 서비스를 만듭니다.

  • 기본 PHP를 사용하며 프레임워크에 의존하지 않습니다.

  • URI 패턴은 REST 규칙을 따라야 합니다.

  • RESTful 서비스는 JSON, XML 등의 형식을 허용하고 반환합니다.

  • 상황에 따라 해당 HTTP 상태 코드에 응답합니다.

  • 요청 헤더 사용을 시연합니다.

  • REST 클라이언트를 사용하여 RESTful 웹 서비스를 테스트하세요.


RESTful Webservice 인스턴스

다음 코드는 RESTful 서비스 클래스 Site.php

입니다.

Instance

<?php
/*
* php 중국어 웹사이트 RESTful 데모 예시
* RESTful 서비스 클래스
*/
Class Site {

​ private
$ 사이트 = 배열(
                                                                                                            배열(
, 3 => ' ​​php'
,                                        ~ ~               . ->사이트; }
    공개 함수 
getSite($id){
        
        
$site = array($id =>( $this->sites [$id]) ?  $this->sites[$id] : $this-> 사이트[ 1]);
        반품 
$site;
    }    
}
?>

RESTful 서비스 URI 매핑

RESTful 서비스 URI는 직관적이고 짧은 리소스 주소로 설정되어야 합니다. Apache 서버의 .htaccess에는 해당 재작성 규칙 세트가 있어야 합니다.

이 예에서는 두 가지 URI 규칙을 사용합니다.

1. 모든 사이트 목록 가져오기:

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

2 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= [nc,qsa]


RESTful Web Service Controller

.htaccess 파일에서 '' 매개변수를 설정하여 RestController.php 파일에서 해당 요청을 받습니다. view', 그리고 'view'를 얻습니다. 다양한 매개변수가 다양한 메서드에 배포됩니다. RestController.php 파일 코드는 다음과 같습니다.

Instance

<?php
require_once("SiteRestHandler.php")
""
;if(isset( $_GET& #91; "view"]))
   
$view = $_GET
&#91;"view"];/* * RESTful 서비스 컨트롤러 * URL 매핑 */switch(

$view

){
케이스 "all":/ / 프로세스 REST Url /site/list/
                               ~
();
휴식; 케이스 "single"
:
//REST URL 처리 /site/show/<id>/                                                                                                                $siteRestHandler->getSite($_GET["id"]);
        break;

    케이스 
"" :
        
// 404 - 찾을 수 없음;
        
break;
}
?>

Simple RESTful 기본 클래스

다음은 요청에 대한 응답으로 HTTP 상태 코드를 처리하기 위한 RESTful 기본 클래스인 SimpleRest.php파일 코드는 다음과 같습니다.

비공개

$httpVersion
=
"HTTP/1.1"
;

공개 함수

setHttpHeaders
($contentType,

$statusCode
){){                                                                 = $this

->
getHttpStatusMessage($statusCode) ($this
->
httpVersion. " " . $상태 코드 ." ".
$statusMessage
)("콘텐츠 유형:". $contentType ); } 공개 기능 getHttpStatusMessage( $상태코드){        $httpStatus = array(
           
100 => '계속',  
            
101 =>  '프로토콜 전환',  
           
200  =>  '확인',
           
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 => 'Gone',  
            
411 => '길이 필수',  
           
412 => '전제조건 실패',  
            
413 => '요청 항목이 너무 큼',  
            
414 => '요청-URI가 너무 길다',  
            
415 => '지원되지 않는 미디어 유형',  
           
416 => '요청한 범위가 만족스럽지 않음',  
           
417 => '기대 실패',  
           
500 => '내부 서버 오류',  
           
501 => '구현되지 않음',  
           
502 => '나쁜 게이트웨이',  
           
503 => '서비스를 사용할 수 없음',  
           
504 => '게이트웨이 시간 초과',  
            
505 => '지원되지 않는 HTTP 버전');
        반환 (
$httpStatus[$statusCode]) ? $httpStatus[$statusCode] : $status[500];
    }
}
?>

RESTful 웹 서비스 처리 클래스

다음은 위에서 제공한 RESTful 기본 클래스를 상속하는 RESTful 웹 서비스 처리 클래스인 SiteRestHandler.php입니다. 이 클래스는 요청 매개변수를 판단하여 반환되는 HTTP 상태 코드와 데이터 형식을 결정합니다. 예 "application/json", "application/xml" 또는 "text/html"의 세 가지 데이터 형식을 제공합니다.

SiteRestHandler.php 파일 코드는 다음과 같습니다.

实例

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

class 
SiteRestHandler 확장 SimpleRest {

    기능 
getAllSites() {    

       
$site = new Site ();
        
$rawData $site- >getAllSite();

        if(empty(
$rawData)) {
          
$statusCode 404 ;
            
$rawData = 배열( '오류' =>  '사이트를 찾을 수 없습니다!');        ㅋㅋㅋ 

$_SERVER['HTTP_ACCEPT'];
        
$this ->setHttpHeaders($requestContentType$statusCode);
                     
        if(
strpos($requestContentType,' application/json') !== false){
           
$response $this->encodeJson( $rawData);
            에코
$response;
        } else if(
strpos($requestContentType,'text/html') !== fal se){
            
$응답 $this->encodeHtml($rawData);
           에코 
$response;
        } else if(
strpos($requestContentType ,'application/xml') !== false){
            
$응답 $this->encodeXml($rawData);
           에코 
$응답 ;
        }
    }
    
    공개 함수 
encodeHtml ($responseData) {
    
        
$htmlResponse "<table border='1'>";
        foreach (
$responseData as $ key=>$value) {
              
$html응답 .= "<tr><td>"$키"</td><td>"$값"</td></tr>";
        }
        
$htmlResponse .= "</table>";
        반환 
$htmlResponse;        
    }
    
    공개 함수 
encodeJson($responseData) {
        
$jsonResponse json_encode($responseData );
        반품 
$jsonResponse;        
    }
    
    공용 함수 
encodeXml($responseData) {
       
// 创建 SimpleXMLElement 对象
        
$xml = 새로운 SimpleXMLElement('<?xml version="1.0"?><site></site>');
        foreach(
$responseData as $key=>$value) {
$xml->addChild($key$value);
       }
        반환 
$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') !== fal se){
            
$응답 $this->encodeHtml($rawData);
           에코 
$response;
        } else if(
strpos($requestContentType ,'application/xml') !== false){
            
$response $this->encodeXml($rawData);
echo
$response;
}
}
}
?>
RESTful 웹 서비스 클라이언트

다음으로 Google Chrome 브라우저의 "Advance Rest Client"를 RESTful 웹 서비스 클라이언트로 사용할 수 있습니다. 우리의 서비스를 요청합니다.

restful1.jpg예제에서는 http://localhost/restexample/site/list/ 주소가 요청되었으며 수신된 데이터는

Accept: application/json

사이트 요청 php(php 중국어 웹사이트) ) ID 3, 접속 주소 http://localhost/restexample/site/list/3/의 경우

restful2.jpg소스 코드 다운로드

다음 버튼을 클릭하면 예제에 사용된 코드를 다운로드할 수 있습니다.

소스코드 다운로드restful3.jpg