php에서 soap 통신을 하기위하여 앞서 php-soap 를 설치하고
검색을 통해서 알게된 사실이다.
정확하게 인지한것인지는 모르겠지만.. (만약 잘못된 정보라면 알려주시면 감사드립니다.)
php-4.* 버젼에서는 soap기본지원이 되지 않고 php5.*버젼에서 기본 지원하기때문에 nusoap라는 클래스가
양쪽 모두 사용가능하여 php soap 통신을 위하여 가장 많이 쓰이며, 간편한 라이브러리라고 한다.
여튼 나는 nusoap클래스를 사용하여 서버, 클라이언트를 테스트 해보았고,
잘 되는것을 확인 하였다.
우선 아래는 찾아봤던 내용의 링크이다.
nusoap 다운로드)
- http://sourceforge.net/projects/nusoap/
예제 )
- http://stackoverflow.com/questions/9130117/nusoap-simple-server
- http://patelmilap.wordpress.com/2011/09/01/soap-simple-object-access-protocol/
soap 관련 설명등)
- http://www.welog.net/gbbs/bbs/board.php?bo_table=php&wr_id=186 (예제)
- http://www.welog.net/gbbs/bbs/board.php?bo_table=php&wr_id=187 (개념)
# nusoap-server.php
$root = $_SERVER["DOCUMENT_ROOT"];
require_once($root.'/Lib/Class/nusoap/nusoap.php');
$server = new soap_server;
$strURL = "www.testNuSoap.com"; #네임스페이스 지정을 해주는것인데 사실 왜 해주는것인지 정확히 모르겠다..
$strNameSpace = $strURL."?wsdl";
$server->configureWSDL("testnusoap",$strNameSpace); //wsdl 생성
$server->register('hello_func',array("name"=>"xsd:string"),array("return"=>"xsd:string")); //함수 등록
# 함수를 등록할때 어는곳에서는 $server->register('hello_func'); 이렇게만 지정을 한다.
# 나의 경우 뒤에 배열 옵션들은 받는 인수, 리턴될 값에 대한 타입을 지정해줬다.
# 이렇게 하지 않으면 출력이 안되더라.. 왜지?
function hello_func($name){
// 에러시 falt 메시지 전달
if($name == ''){
return new soap_fault('Client','','Must supply a valid name.');
}
return "hello ".$name;
}
$server->service($HTTP_RAW_POST_DATA);
# nusoap-client.php
ini_set("soap.wsdl_cache_enabled", "0");
$root = $_SERVER["DOCUMENT_ROOT"];
require_once($root.'/Lib/Class/nusoap/nusoap.php');
try{
## 서버 server.php 의 URL을 넘겨줌
$strServerURL = "http://192.168.30.24/soap/nusoap-server.php?wsdl";
$soapclient = new soapclient($strServerURL);
## 서버에서 실행할 함수호출
$parameters = urlencode("Eno");
$result = $soapclient->hello_func($parameters);
echo urldecode($result);
}catch(SoapFault $exception){
echo $exception->getMessage();
}
# 결과
hello Eno
위 소스는 server.php 에서 wsdl을 생성, client.php에서 해당 내용을 읽어 server.php의 함수를 사용하는것. 이게 주된 내용이다.
nusoap를 사용하기 이전에 php.net에 나와있는것처럼
SoapServer, SoapClient 클래스를 사용하여 테스트를 했을때는 아래와 같았다.
# soap-server.php
function printString($nCode)
{
if($nCode == "1")
{
return "1입력";
}else{
return "그외 입력됨.";
}
}
try {
$server = new SOAPServer(NULL,array('uri' => 'http://192.168.30.24/soap/soap-server.php'));
$server->addFunction("printString");
$server->handle();
}catch(SOAPFault $f){
print $f->faultstring;
}
# soap-client.php
$client = new SoapClient(null, array('location' => "http://192.168.30.24/soap/soap-server.php",'uri' => "http://192.168.30.24/soap/soap-server.php"));
echo $return = $client->__soapCall("printString",array("1"));
# 결과
1입력
결국 두개다 server.php에서 선언된 함수 사용이 가능했다.
확인은 했지만.. 실제 적용을 해야하는데 개념이 잘 안잡힌다. OTL
업무를 진행하고나서 이번 포스트에는 수정해야 할 내용이 많을것같다.
이상 여튼 soap사용법은 이러하다.