SOAP는 XML과 HTTP 통신 프로토콜, XML 각 플랫폼, 각종 언어를 기반으로 지원하는 언어다.
WSDL은 웹 서비스 설명 언어입니다. (Web Services Description Lan)guage)는 XML 형식의 문서이다.이 문서는 웹 서비스를 묘사할 수 있다.서비스의 위치, 서비스 제공의 운영을 규정할 수 있다.
서로 다른 언어 간에 통신이 필요하며(예: php, java, c), SOAP, WSDL을 통해 서로 다른 동작을 할 수 있습니다.시스템을 만들고 서로 다른 기술의 프로그래밍 언어가 서로 통신한다.
php soap 확장 설치
php 설치 패키지의 ext/soap 디렉터리에 있는 확장 위치, 설치 단계:
cd php-5.3.15/ext/soap
phpize
./configure
sudo make
sudo make test
성공적으로 설치되면 phpinfo에서 soap 확장을 볼 수 있습니다
SOAP는 NO-WSDL과 WSDL 두 가지 방식으로 동작한다.
NO-WSDL 모드: 사용할 정보를 전달하기 위해 매개 변수를 사용합니다.
WSDL 모드: WSDL 파일 이름을 인수로 사용하고 WSDL에서서비스에 필요한 정보를 추출합니다.(매번 수정하면 clie를 수정해야 합니다.nt와 server의 wsdl 파일, NO-WSDL 모드가 유연하지 않습니다. 나중에 이 모드 사용에 대해 소개하겠습니다.
SOAP에는 주로 SOAPServer, SOAP 세 가지 클래스가 사용됩니다.Client, SOAPFault
NO-WSDL 모드:
soapHandle.class.php 요청 처리
<?php
class soapHandle{
public function strtolink($url=''){
return sprintf('<a href="%s">%s</a>', $url, $url);
}
}
?>
server.php soap 서비스 측
<?php
// 서버 인증
if ($_SERVER['PHP_AUTH_USER']!='fdipzone' || $_SERVER['PHP_AUTH_PW']!='123456') {
header('WWW-Authenticate: Basic realm="MyFramework Realm"');
header('HTTP/1.0 401 Unauthorized');
echo "You must enter a valid login ID and password to access this resource.\n";
exit;
}
require("soapHandle.class.php"); // 요청한 class 처리
try{
$server = new SOAPServer(null, array('uri'=>'http://demo.fdipzone.com/soap/server.php'));
$server->setClass('soapHandle'); //처리 클래스 설정
$server->handle();
}catch(SOAPFault $f){
echo $f->faultString; // 오류 메시지 출력
}
?>
클라이언트.php soap
<?php
try{
$client = new SOAPClient(null, array(
'location' => 'http://demo.fdipzone.com/soap/server.php', // 서버 경로 설정
'uri' => 'http://demo.fdipzone.com/soap/server.php',
'login' => 'fdipzone', // HTTP auth login
'password' => '123456' // HTTP auth password
));
echo $client->strtolink('http://blog.csdn.net/fdipzone').'<br>'; // 서버 메서드 직접 호출
echo $client->__soapCall('strtolink', array('http://blog.csdn.net/fdipzone')); // 서버 메서드 간접 호출
}catch(SOAPFault $e){
echo $e->getMessage();
}
?>
Header 인증 예제:
server.php
<?php
//서버 인증
if ($_SERVER['PHP_AUTH_USER']!='fdipzone' || $_SERVER['PHP_AUTH_PW']!='123456') {
header('WWW-Authenticate: Basic realm="NMG Terry"');
header('HTTP/1.0 401 Unauthorized');
echo "You must enter a valid login ID and password to access this resource.\n";
exit();
}
require 'SOAPHandle.class.php';
$config = array(
'uri' => 'http://demo.fdipzone.com/soap/server.php'
);
$oHandle = new SOAPHandle;
// no wsdl mode
try{
$server = new SOAPServer(null, $config);
$server->setObject($oHandle);
$server->handle();
}catch(SOAPFault $f){
echo $f->faultString;
}
?>
client.php
<?php
$config = array(
'location' => 'http://demo.fdipzone.com/soap/server.php',
'uri' => 'http://demo.fdipzone.com/soap/server.php',
'login' => 'fdipzone',
'password' => '123456',
'trace' => true
);
try{
$auth = array('fdipzone', '654321');
// no wsdl
$client = new SOAPClient(null, $config);
$header = new SOAPHeader('http://demo.fdipzone.com/soap/server.php', 'auth', $auth, false, SOAP_ACTOR_NEXT);
$client->__setSoapHeaders(array($header));
$revstring = $client->revstring('123456');
$strtolink = $client->__soapCall('strtolink', array('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1));
$uppcase = $client->__soapCall('uppcase', array('Hello World'));
echo $revstring.'<br>';
echo $strtolink.'<br>';
echo $uppcase.'<br>';
}catch(SOAPFault $e){
echo $e->getMessage();
}
?>
SOAPHandle.class.php
<?php
class SOAPHandle{ // class start
// header 인증
public function auth($auth){
if($auth->string[0]!='fdipzone' || $auth->string[1]!='654321'){
throw new SOAPFault('Server', 'No Permission');
}
}
// 문자열 반전
public function revstring($str=''){
return strrev($str);
}
// 문자 전송 연결
public function strtolink($str='', $name='', $openwin=0){
$name = $name==''? $str : $name;
$openwin_tag = $openwin==1? ' target="_blank" ' : '';
return sprintf('<a href="%s" %s>%s</a>', $str, $openwin_tag, $name);
}
// 문자열 대문자 변환
public function uppcase($str){
return strtoupper($str);
}
} // class end
?>
SOAPHeader 네 번째와 다섯 번째 매개 변수 설명:
Must Understand
이 매개 변수는 서비스 측에서 Soap에 응답해야 하는지 여부를 나타냅니다.Header, 이 인자가 참이면, 서비스 측에서 응답한 Header를 인식하지 못해 Soap Fault(Header not understood)를 발생시킨다.
SOAP_ACTOR_NEXT
actor가 SoapHeader가 누구에게 전달할 것인지를 가리켰습니다., 어느 Service에서 처리되었습니까.
SOAP_ACTOR_NEXT의 뜻은 다음과 같다.이 요청 헤더에 대한 서비스ce.
SoapServer의 구조함수에서 우리는 할 수 있다.서버의 Actor를 지정합니다., 예:
<?php
$config = array(
'uri' => 'http://demo.fdipzone.com/soap/server.php',
'actor' => 'myserver'
);
$server = new SOAPServer(null, $config);
?>
그러면 Client의 SoapHeader에서 actor가 myserver라는 설정을 통해 우리가 설정한 헤더의 정보를 지정된 Server로 얻을 수 있습니다
'개발 꿀팁 > PHP' 카테고리의 다른 글
C를 사용하여 php 확장 만들기 (0) | 2022.08.19 |
---|---|
php 짧은 URL 생성 (0) | 2022.08.18 |
php unserialize false 해결 방법 반환 (0) | 2022.08.17 |
PDO 쿼리mysql을 사용하여 SQL 주입을 피함 (0) | 2022.08.17 |
php 빈 디렉터리 및 빈 하위 디렉터리 삭제 (0) | 2022.08.17 |