2009-04-01 3 views
6

메시지에서 둘 이상의 네임 스페이스를 사용하는 nuSOAP (여기서는 PHP4에 바인딩되었으므로)를 사용하여 WebService에 액세스하려고합니다. 그게 가능하니? 요청 메시지는 다음과 같이 보일 것이다여러 네임 스페이스가있는 메시지에 nuSOAP를 사용하는 방법

예 :

<soapenv:Envelope ... 
    xmlns:ns1="http://domain.tld/namespace1" 
    xmlns:ns2="http://domain.tld/namespace2"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <ns1:myOperation> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation> 
    </soapenv:Body> 
</soapenv:Envelope> 

내가 다음에 시도 : nuSOAP 올바른 네임 스페이스와 노드에이 이름과 일치하도록 시도 할 것이라는 희망

$client = new nusoap_client("my.wsdl", true); 
$params = array(
    'Person' => array(
    'FirstName' => 'Thomas', 
    .. 
    ), 
    'Attribute' => 'foo' 
); 

$result = $client->call('myOperation', $params, '', 'soapAction'); 

. 그럼 난 요소와 자신의 네임 스페이스를 생성하는 soapval()를 사용하려고 -하지만이 작업을 호출하는 경우, nuSOAP는 다음과 같은 요청을 생성합니다

<SOAP-ENV:Envelope ...> 
    <SOAP-ENV:Body> 
    <queryCCApplicationDataRequest xmlns="http://domain.tld/namespace1"/> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

그래서 뭔가 "일치"단계에서 잘못을.

답변

5

일치 주변에 시도 후, 나는 두 가지 솔루션을 발견 :

1) 메시지 를 만들 nusoap_client 및 soapval()를 생성하기 위해 WSDL을 사용하지 마십시오을이 메시지에 포함 된 단점이있다 많은 오버 헤드 (네임 스페이스는 각 요소에 정의되어있다). 별로 좋지 않아.

2) 매개 변수의 일치에 의존하는 대신 xml로 답장을 구성하고 첫 번째 요소에 접두어에 대한 모든 정의를 입력하십시오.

$params = "<ns1:myOperation xmlns:ns1="..." xmlns:ns2="..."> 
     <ns2:Person> 
     <ns2:Firstname>..</ns2:Firstname> 
     .. 
     </ns2:Person> 
     <ns1:Attribute>..</ns1:Attribute> 
    </ns1:myOperation>"; 
아직

하지 아주 좋은 솔루션,하지만 :-) 작동

+0

방금 ​​솔루션을 시도하고 작동합니다 .... 감사합니다. –

0

그래, 나는이 같은 문제가 (를 통해 구글 사용자의 Q 발견!)를 그리고 난이 건너 한 꾸게 : http://www.heidisoft.com/blog/using-nusoap-consume-net-web-service-10-min 여기서 dev는 coe에 메시지의 xml 본문을 만든 다음 nusoap을 사용하여 제출합니다.

+0

흠, 링크가 현재 작동하지 않는 것 같습니다. 당신이 말한 것에서, XML을 "수동으로"만드는 유사한 접근 방식을 따르는 것 같습니다. 맞습니까? – wilth

4

Irwin의 게시물을 기반으로 작성한 xml은 수동으로 작성하고 나머지 작업은 수행하지 않았습니다. 내 웹 호스트에는 PHP 비누 확장이 없으므로, nusoap을 사용해야하고 웹 서비스에서 각 태그의 네임 스페이스 (예 : 여기에 사용자 이름과 비밀번호)가 필요합니다.

Notice: Undefined property: nusoap_client::$operation in ./lib/nusoap.php on line 7674 

그래서 나는 게으른 길을 가서 nusoap.php의에 가서 라인 7674이 행복하게 전에이 코드를 추가 :

if(empty($this->operation)) { 
     $this->operation = ""; 
    } 

require_once('lib/nusoap.php'); 

$client = new nusoap_client('https://service.somesite.com/ClientService.asmx'); 
$client->soap_defencoding = 'utf-8'; 
$client->useHTTPPersistentConnection(); // Uses http 1.1 instead of 1.0 
$soapaction = "https://service.somesite.com/GetFoods"; 

$request_xml = '<?xml version="1.0" encoding="utf-8" ?> 
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <env:Body> 
    <n1:GetFoods xmlns:n1="https://service.somesite.com"> 
     <n1:username>banjer</n1:username> 
     <n1:password>theleftorium</n1:password> 
    </n1:GetFoods> 
    </env:Body> 
</env:Envelope> 
'; 

$response = $client->send($request_xml, $soapaction, ''); 

echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Debug</h2><pre>' . htmlspecialchars($client->getDebug(), ENT_QUOTES) . '</pre>'; 

그럼 내가 말했다 오류가 발생했습니다

+0

며칠 동안 인터넷을 수색 한 후 이것이 내게 도움이되는 유일한 것입니다. 고맙습니다! 나는 그 오류를 얻지 못했지만 $ client-> endpoint = '';을 설정해야했습니다. – Cypher909

1

이 문제를 우회하려면 nusoap_client :: call() 함수를 수정해야합니다. nusoap.php의에서 (버전 1.123에서 7359)이이 줄에 다음 :

$nsPrefix = $this->wsdl->getPrefixFromNamespace("other_ns_name"); 

그리고 그것은 일 : $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace);

나는이 하나 추가! 한 프로젝트에만이 라이브러리가 필요했기 때문에이 해킹을 하드 코딩해도 괜찮습니다. 그렇지 않으면, 나는 더 많이 파고 네임 스페이스 매개 변수에 대한 문자열 대신 배열을 받아들이도록 함수를 수정합니다.

관련 문제