PHP Cookbook 독서 노트 – 제1 5 장 웹 서비스 만 들 기

9034 단어 독서 노트
REST 의 WEB 서 비 스 를 실현 하 다
REST 를 실현 하 는 웹 서 비 스 는 상대 적 으로 간단 하 며 HTTP 의 GET, POST, PUT, DELETE 특성 을 사용 했다.그 PHP 의 처리 코드 는 일반 처리 POST 와 GET 와 매우 비슷 하 다.
//      

$request_method = strtoupper($_SERVER['REQUEST_METHOD']);



switch ($request_method) {

case 'GET':

    $action = 'search';

    break;

case 'POST':

    $action = 'add';

    break;

case 'PUT':

    $action = 'update';

    break;

case 'DELETE':

    $action = 'delete';

    break;

default:

    //      

    exit();

}

//     XML   Json      

이 코드 는 4 가지 서로 다른 요청 을 처리 하 는 것 입 니 다. SQL 과 REST 의 대응 관 계 는 다음 표를 볼 수 있 습 니 다.
SQL
REST
CREATE
POST
SELECT
GET
UPDATE
PUT
DELETE
DELETE
인증 이 필요 한 방문 이 rest 에서 어떻게 이 루어 지 는 지 에 대해 서 는 책 에 언급 되 지 않 았 다.현재 많은 오픈 API 는 권한 을 수 여 받 은 후에 만 사용 할 수 있 습 니 다. 그 실현 원 리 는 요청 할 때마다 추가 적 인 파 라 메 터 를 가 져 가 야 합 니 다. 이 파 라 메 터 는 암호 화 된 검증 권한 수여 정 보 를 거 친 것 입 니 다.
SOAP 방식 으로 데이터 제공
ext/soap 의 SOAPServer 클래스 를 사용 하여 WSDL 이 없 는 WEB 서 비 스 를 실현 합 니 다. SOAPServer 를 사용 하여 WEB 서 비 스 를 구축 하 는 것 과 PHP 를 쓰 는 일반적인 클래스 의 차이 가 크 지 않 습 니 다 (물론 함수 로 도 사용 할 수 있 습 니 다). 즉, SOAPServer 를 실례 화 할 때 유사 한 이름 을 관련 시 키 는 것 입 니 다. 다음은 간단 한 예 입 니 다.
class pc_SOAP_return_time {

    public function return_time() {

        return date('Ymd\THis');

    }

}



$server = new SOAPServer(null, array('uri'=>'urn:pc_SOAP_return_time'));

$server->setClass('pc_SOAP_return_time');

$server->handle();

클 라 이언 트 호출 서비스의 코드 는 다음 과 같 습 니 다.
$opts = array('location' => 'http://api.example.org/getTime',

              'uri' => 'urn:pc_SOAP_return_time');

$client = new SOAPClient(null, $opts);

$result = $client->__soapCall('return_time', array());

print "The local time is $result.
";

함수 로 처리 한 책 에 도 소개 가 있 는데, 내 머 릿 속 에 OO 가 가득 차 서 생략 했다.
클 라 이언 트 가 서버 에 존재 하지 않 는 방법 을 호출 하면 서버 는 SOAP 고장 으로 응답 합 니 다. 응답 내용 을 제어 하려 면 다음 코드 와 같이 call () 방법 으로 이 루어 질 수 있 습 니 다.
class pc_SOAP_Process_All_Methods {



    // Handle any undefined methods here

    public function __call($name, $args) {

        // ...

    }

}



$server = new SOAPServer(null, array('uri'=>'urn:pc_SOAP_Process_All_Methods'));

$server->setClass('pc_SOAP_Process_All_Methods');

$server->handle();

SOAP 방법 에서 인 자 를 받 아들 입 니 다.
서버 에서 매개 변 수 를 추가 한 다음 클 라 이언 트 호출 시 SOAP Client - > soapCall (return time, array (매개 변수 배열) 을 정의 합 니 다. 간단 하지 않 습 니까? 위의 코드 는 각각 1 곳 씩 수정 하면 됩 니 다.
class pc_SOAP_return_time {

//     ,   $tz  

    public function return_time($tz = '') {

        if ($tz) { $my_tz = date_default_timezone_set($tz); }

        $date = date('Ymd\THis');

        if ($tz) { date_default_timezone_set(ini_get('date.timezone')); }

        return $date;

    }

}



$server = new SOAPServer(null,array('uri'=>'urn:pc_SOAP_return_time'));

$server->setClass('pc_SOAP_return_time');

$server->handle();
클 라 이언 트 호출
$opts = array('location' => 'http://api.example.org/getTime',

              'uri' => 'urn:pc_SOAP_return_time');

$client = new SOAPClient(null, $opts);

//     , tz      

$result = $client->__soapCall('return_time', array('tz' => 'Europe/Oslo'));

print "The local time is $result.
";

WSDL 파일 자동 생 성
앞에서 말 했 듯 이 ext/soap 확장 은 WSDL 자동 생 성 기능 을 지원 하지 않 습 니 다. 수 동 으로 WSDL 파일 을 생 성 하 는 것 을 고려 할 수 있 습 니 다. (여러분 이 그렇게 하지 않 을 것 이 라 고 믿 습 니 다) 그리고 아래 의 비공 식 스 크 립 트 를 통 해 이 루어 질 수 있 습 니 다. 주의해 야 할 것 은 이 몇 가지 방식 이 SOAP 와 WSDL 규칙 을 완전히 지원 하지 못 했 습 니 다. 잘 사용 하려 면 자세히 연구 해 야 합 니 다.
WSDL_Gen, by George Schlossnagle
http://www.schlossnagle.org/~george/blog/index.php?/archives/234-WSDLGeneration.html
wsdl-writer, by Katy Coe based on code by David Griffin
http://www.djkaty.com/drupal/php-wsdl
Web service helper, by David Kingma
http://jool.nl/new/
SOAP 헤드 정보 처리
ext/soap SOAP 헤드 가 있 는 클 라 이언 트 요청 을 발견 하면 먼저 같은 이름 의 함 수 를 호출 하려 고 시도 합 니 다. 호출 이 완료 되면 SOAP 주체 에서 지정 한 함 수 를 계속 호출 합 니 다. 이렇게 하면 SOAP 헤드 데 이 터 를 기반 으로 모든 사전 요청 을 수행 할 수 있 습 니 다.
그러나 ext/soap 서버 측은 SOAP 의 머리 와 주 체 를 프로 그래 밍 방식 으로 구분 하지 않 습 니 다. ext/soap SOAP 헤드 를 발견 하면 주 체 를 처리 하기 전에 이 머리 요소 와 같은 이름 의 방법 을 사용 하려 고 시도 합 니 다.
SOAP 클 라 이언 트 가 지정 한 머리 가 존재 하지 않 으 면 ext/soap 이 방법 을 건 너 뛰 어 주체 로 바로 이동 합 니 다. 머리 에 있 는 must Understand 속성 이 true 로 표시 되면 SOAPServer 에서 SOAP 고장 이 발생 합 니 다.
$opts = array('location' => 'http://api.example.org/getTime',

              'uri' => 'urn:pc_SOAP_return_time');

$client = new SOAPClient(null, $opts);

$set_timezone = new SOAPVar('Europe/Oslo', XSD_STRING);



//  SOAP  

$tz = new SOAPHeader('urn:pc_SOAP_return_time', 'set_timezone', $set_timezone);



$result = $client->__soapCall('return_time', array(), array(), array($tz));

print "The local time is $result.
";

SOAP 헤더 정보 생 성
class pc_SOAP_return_time {

    public function return_time() {

        $tz = date_default_timezone_get();



        //      

        $header = new SoapHeader('urn:pc_SOAP_return_time', 'get_timezone', $tz);



        $GLOBALS['server']->addSoapHeader($header);

        return date('Ymd\THis');

    }

}

$server = new SOAPServer(null, array('uri'=>'urn:pc_SOAP_return_time'));

$server->setClass('pc_SOAP_return_time');

$server->handle();

방법의 역할 영역 에서 $server 대상 에 쉽게 접근 할 수 없 기 때문에 $GLOBALS 배열 을 통 해 접근 해 야 합 니 다. 응답 할 때 아래 의 SOAP 헤더 가 포 함 됩 니 다.

 
   
America/Los Angeles

SOAP 헤드 로 검증
SOAP 의 머리 정 보 를 강제로 ext/soap 요청 할 방법 이 없 기 때문에 검증 이 필요 한 모든 방법 에 판단 문 구 를 추가 하여 pc authenticate user 를 판단 해 야 합 니 다. 클 라 이언 트 가 검증 을 통과 하지 않 으 면 SOAP 고장 을 던 져 야 합 니 다.
function pc_authenticate_user($username, password) {

    // authenticate user

    $is_valid = true; // Implement your lookup here



    if ($is_valid) {

        return true;

    } else {

        return false;

    }

}





class pc_SOAP_return_time {

    private $authenticated;



    public function __construct() {

        $this->authenticated = false;

    }



    public function authenticate_user($args) {

        // Throw SOAP fault for invalid username and password combo

        if (! pc_authenticate_user($args->username,

                                   $args->password)) {



            throw new SOAPFault("Incorrect username and password combination.", 401);

        }



        $this->authenticated = true;

    }



    // Rest of SOAP Server methods here...

    public function soap_method() {

        if ($this->authenticated) {

            // Method body here...

        } else {

            throw new SOAPFault("Must pass authenticate_user Header.", 401);

        }

    }



}



$server = new SOAPServer(null, array('uri'=>'urn:pc_SOAP_return_time'));

$server->setClass('pc_SOAP_return_time');



$server->handle();
다음은 클 라 이언 트 가 호출 한 코드 입 니 다.
$opts = array('location' => 'http://api.example.org/getTime',

              'uri' => 'urn:pc_SOAP_return_time');

$client = new SOAPClient(null, $opts);

class SOAPAuth {

    public $username;

    public $password;

    public function __construct($username, $password) {

        $this->username = $username;

        $this->password = $password;

    }

}



$auth = new SOAPAuth('elvis', 'the-king');

$header = new SOAPHeader('urn:example.org/auth', 'authenticate_user', $auth);

$result = $client->__soapCall('return_time', array(), array(), array($header));

좋은 웹페이지 즐겨찾기