개발 꿀팁/PHP

php soap 사용 사례

Jammie 2022. 8. 18. 17:17
반응형

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로 얻을 수 있습니다

반응형