2010-11-19 3 views
1

SOAP에 익숙하지 않고 문제가 있습니다. (예, 광범위하게 검색했지만 매우 일치하는 것처럼 보입니다. 간단한 요구 사항 - 닷넷 서버에 약간의 출력을 전송로) 하나의 XML 문자열을 보내는이 일치하도록 :PHP SOAP 또는 nusoap에서 .NET 서비스로 XML 문자열 (배열이 아님)을 전송합니다.

<?php 
require_once('../lib/nusoap.php'); 

$bodyxml = '<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Body> 
<SubmitCalls xmlns="http://somehost/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<request> 
<?xml version="1.0" encoding="UTF-8"?> 
<bXML xmlns="http://somehost/Schemas" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<From> 
    <UserName>some username</UserName> 
    <Password>some password</Password> 
</From> 
<Calls> 
    <Call> 
    <Reference>11111</Reference> 
    <Name>Joe Bloggs</Name> 
    <Tel1>02075574200</Tel1> 
    <Tel2>02075574201</Tel2> 
    <Tel3>02075574202</Tel3> 
    <Tel4>02075574203</Tel4> 
    <Tel5>02075574204</Tel5> 
    <CLI>08448220640</CLI> 
    <CallTime>09:00</CallTime> 
    <FileName>02075574200_1</FileName> 
    </Call> 
<Call> 
    <Reference>11111</Reference> 
    <Name>Joe Bloggs</Name> 
    <Tel1>02075574200</Tel1> 
    <Tel2>02075574206</Tel2> 
    <Tel3>02075574207</Tel3> 
    <Tel4>02075574208</Tel4> 
    <Tel5>02075574209</Tel5> 
    <CLI>08448220640</CLI> 
    <CallTime>09:00</CallTime> 
    <FileName>02075574200_2</FileName> 
    </Call> 
</Calls> 
</bXML> 
</request> 
</SubmitCalls> 
</soap:Body> 
</soap:Envelope> 
'; 


$client = new nusoap_client("somehost?WSDL",true); 
$err = $client->getError(); 
if ($err) { 
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>'; 
exit(); 
} 

$client->soap_defencoding = 'utf-8'; 
$client->useHTTPPersistentConnection(); 
$client->setUseCurl($useCURL); 
$bsoapaction = "http://somehost/SubmitCalls"; 
$result = $client->send($bodyxml, $bsoapaction); 
// Check for a fault 
if ($client->fault) { 
echo '<h2>Fault</h2><pre>'; 
print_r($result); 
echo '</pre>'; 
} else { 
// Check for errors 
$err = $client->getError(); 
if ($err) { 
    // Display the error 
    echo '<h2>Error</h2><pre>' . $err . '</pre>'; 
} else { 
    // Display the result 
    echo '<h2>Result</h2><pre>'; 
    print_r($result); 
    echo '</pre>'; 
} 
} 
echo '<h2>Request</h2><pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>'; 
echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>'; 
echo '<h2>Client Debug</h2><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>'; 
echo '<h2>Proxy Debug</h2><pre>' . htmlspecialchars($proxy->debug_str, ENT_QUOTES) . '</pre>'; 
?> 

(Obiously, 모든 somehost과 :

POST /someurl.asmx HTTP/1.1 
Host: www.somehost.com 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://somehost.com/SubmitCalls" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <SubmitCalls xmlns="http://somehost/"> 
     <request>string</request> 
    </SubmitCalls> 
    </soap:Body> 
</soap:Envelope> 

내 nusoap 코드는 다음과 같습니다 사용자 이름은 최종 스크립트에서 정확합니다). WSDL에 연결하여 읽을 수 있습니다. WSDL 스키마에 'parameters'라는 부분이 하나만있는 (SubmitCalls) 메소드가 하나 있습니다. 위의 400 잘못된 요청 오류 던졌습니다 - 내가 잘못 가고있는 모든 아이디어?

대신 PHP SOAP을 사용해 보았습니다.하지만 XML 문자열을 SOAP 요청의 본문으로 보낼 수 없습니다. 저는 3 일 동안 가장 좋은 시간을 보냈을뿐 아니라 엄청난 웹 페이지를 읽었습니다.하지만 여전히 제대로 이해할 수는 없습니다. 제발 도와주세요 .... 만약 당신이 나에게 어느 도서관을 사용하여 이것을 어떻게 할 수 있는지 엄청나게 감사 할 것입니다 ....

답변

0

언제나 xml을 문자열로 보내고 라이브러리를 스크루 할 수 있습니다. 권장하지는 않지만 더 쉬운 경우도 있습니다.

이 문제에 Header("SoapAction: ...")

+0

SoapAction 헤더는 send 함수의 두 번째 매개 변수로 설정됩니다. (내 코드에서 var bsoapaction) 생각합니다. 내가 잘못 설정하지 않는다면 ... – odeclas

+0

진지하게,이 포인터는 전혀 제발? 400 개의 잘못된 요청 오류가 발생하는 것처럼 보입니다.이 문맥에서 의미하는 것은 무엇입니까? 헤더 정보가 잘못되었거나 인코딩 된 것을 의미합니까? 아니면 나는 끈이있는 무언가를하고 있는가? – odeclas

+0

필자는 .NET 클라이언트에서 작동하는 $ 요청을 사용하여 PHP SOAP 및 __doRequest를 사용해 보았지만 여전히 400 개를 얻었습니다. – odeclas

1

아니 정확히 대답을 잊지 마세요 -하지만 지금은 해결된다. 서비스 제공 업체는 문자열이 아닌 XML 문서를 허용한다는 점을 제외하면 모든면에서 동일한 새로운 방법을 만들었습니다. $ bodyxml 변수의 내용을 약간 변경하고이 새로운 메소드로 보내면 잘 작동하는 것 같습니다.

그런데 SOAP 애플리케이션을 디버깅하려는 사람은 누구나 Sourceforge에서 SOAP UI를 가져와야합니다. 이것은 정말로 제 정신이 내 문제를 점검하는 데 도움이되었고, 수정을위한 유용한 조언을 제공했습니다.

3

꼬 시러 다니구 this-

$xml = simplexml_load_string('<data>x</data>') 

다음 (nusoap)

$result = $client->call('host', array('parameter' =>$xml) 
5

() 메소드를 보내>는 $ 클라이언트 -와 일반 XML을 보낼 수 있습니다.

$raw_xml = "<Your_XML>...</Your_XML>"; 
$msg = $client->serializeEnvelope("$raw_xml"); 
$result=$client->send($msg, $endpoint); 

당신은 여기에서 예를 볼 수 있습니다

http://itworkarounds.blogspot.com/2011/07/send-raw-xml-with-php-nusoap.html

을 그 does't 작업이 CURL와 XML을 게시하려고 할 수 있습니다.