php pear로 닷넷서버와 SOAP통신하기.
얼마전 c#을 이용해 닷넷으로 SOAP 서버를 맡기고,
php 의 pear SOAP으로 클라이언트를 만들어 통신을 하였으나
pear SOAP에서 생성하는 xml코드를 닷넷서버가
받아들이지 않아 정상적인 호출이 이루어지지않았습니다.
따라가다보니 function name에 해당하는 테그의 namespace 표현방식의 문제였고, 아래사항을 패치하였습니다.
pear SOAP의 버젼은 0.8.1 입니다.
--- Base.php.orig 2005-05-16 17:21:54.589970712 +0900
+++ Base.php 2005-05-16 17:25:21.484517960 +0900
@@ -524,10 +524,12 @@
// add namespaces
if ($elNamespace) {
$elPrefix = $this->_getNamespacePrefix($elNamespace);
- $xmlout_name = "$elPrefix:$name";
+ //$xmlout_name = "$elPrefix:$name";
+ $xmlout_name = "$name xmlns=\"$elNamespace\"";
} else {
$xmlout_name = $name;
}
+ $xmlout_name_close = $name;
if ($typeNamespace) {
$typePrefix = $this->_getNamespacePrefix($typeNamespace);
@@ -557,14 +559,14 @@
$xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xml_attr/>";
} else {
$xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xmlout_offset$xml_attr>".
- $xmlout_value."</$xmlout_name>";
+ $xmlout_value."</$xmlout_name_close>";
}
} else {
if (is_null($xmlout_value)) {
$xml = "\r\n<$xmlout_name$xmlns$xml_attr/>";
} else {
$xml = "\r\n<$xmlout_name$xmlns$xml_attr>".
- $xmlout_value."</$xmlout_name>";
+ $xmlout_value."</$xmlout_name_close>";
}
}
return $xml;
내용을 간략하게 설명하자면
pear에서 생성하는 xml은
<namespace:function>
<arg1> </arg1>
</namespace:function>
위의 방식으로 생성하게 됩니다만,
닷넷서버가 알아들을라면
<function xmlns="namespace">
<arg1> </arg1>
</function>
위와 같이 해야합니다.
또다른 SOAP 툴킷인 gSOAP과도 비교를 해보았는데
gSOAP서버의 경우 pear의 <ns:function> 방식도 이해하고
<function xmlns=ns> 방식도 이해를 하고,
gSOAP 클라이언트의 경우 닷넷처럼 <function xmlns=ns> 형식으로
xml문서를 만듭니다.
soap에 대한 지식이 얕아 뭐가 표준에 부합하는것인지 잘 모르고, pear에 패치한 내용이 올바른 접근 방식인지 역시 모르겠습니다.
일단 저렇게 하니 닷넷서버와의 통신은 성공을 하였고, 값도 잘 받아옵니다.
이 패치의 다른 영향에 대해서는 전혀 테스트 하지 않았습니다.
혹시 이 글을 참조하실 경우 충분한 테스트를 통해 적용하시길 권장드립니다.
손님으로 쓰여졌군요.윗글은 제가 썼습니다.원인이 로긴을 하
손님으로 쓰여졌군요.
윗글은 제가 썼습니다.
원인이 로긴을 하고, 글 쓰기 버튼을 누른 후 에디트를 하다가, 딴일이 있어서 일을 보다가 몇시간 후 제출버튼을 눌렀는데
그 사이 세션 타임아웃이 나서 전에 로긴한게 취소되고
손님으로 전송되는듯 하네요..다음에는 주의해야할듯 싶네요. :)
AXIS와는 잘 되더군요.
제가 SOAP 표준 규약은 잘 모르겠지만 몇일 전에 간단하게 시험한 결과로는 apache의 AXIS와 잘 되더군요. 다만 제 경우는 axis를 사용한 쪽이 서버였고 PEAR::SOAP를 사용한 쪽이 서버였습니다.
UTF-8 인코딩을 사용한 한글 전달도 문제 없었습니다. 예전에 apache의 XML-RPC와 PHP의 XML-RPC는 한글이 잘 안되어서 apache의 XML-RPC를 수정해줘야 했었는데 AXIS는 문제 없더군요.
댓글 달기