PHP Cookbook 독서 노트 – 제1 5 장 웹 서비스 만 들 기
9034 단어 독서 노트
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));
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로그'메타프로그램 루비 버전 2'3장 읽기동적 방법 Object#send 호출 방법은 약간 메모와 Object#send obj.send(:my_method, 3) Object#send를 사용하면 어떤 방법으로든 호출할 수 있습니다. privete 방법을 호...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.