2010-11-19 7 views
1

私はSOAPを初めて使い、問題があります。シンプルな要件 - これに合わせて、.NETサーバに何らかの出力を送信することで)単一のXML文字列を送信する:PHP SOAPまたはnusoapから.NETサービスへのXML文字列(配列ではありません)の送信

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コードは次のようになります。

<?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とユーザー名は最終的なスクリプトで正しい)。私はWSDLに接続して読むことができます。興味深いのは、WSDLスキーマで 'parameters'という名前の部分が1つしかない(SubmitCalls)メソッドです。上記は400の間違った要求エラーを投げます - 私は間違っていますか?

代わりにPHP SOAPを使用しようとしましたが、XML文字列をSOAPリクエストの本体として送信できないようです。私はこれを3日間の最中にしゃべっていましたが、膨大なWebページを読んでいましたが、それでも正しいことはできません。助けてください...あなたが私にどちらかのライブラリを使ってこれを行う方法を私に示すことができたら、私は非常に感謝しています....

答えて

0

xmlを文字列として送信してライブラリをスクラップすることができます。お勧めはしませんが、場合によってはより簡単です。

は問題にHeader("SoapAction: ...")

+0

SoapActionヘッダーは、send関数の2番目のパラメーターで設定されています(私のコードでは、var bsoapaction)。私はそれを間違って設定していない限り.... – odeclas

+0

真剣に、すべてのポインタは、このすべてでください?私が400の間違った要求エラーを生成しているように見える - この文脈ではどういう意味ですか?ヘッダー情報が間違っているか、エンコーディングかを意味しますか?それとも、私は弦を使って何かをしていますか? – odeclas

+0

私は、.NETクライアントから明らかに動作する$要求を使用してPHP SOAPと__doRequestを試してみましたが、まだ400を取得しています。 – odeclas

1

ない正確な答えを忘れてはいけない - しかし、それは解決されました。サービスプロバイダは新しいメソッドを作成しました。これは、文字列ではなくXMLドキュメントを許可する点を除いて、すべての点で同じです。 $ bodyxml変数の内容を少し変更してこの新しいメソッドに送信することで、正常に動作するように見えます。

ところで、SOAPアプリケーションをデバッグしようとする人は、本当にSourceforgeからSOAP UIを取得する必要があります。これは本当に私の問題点をチェックしてくれました。

3

-try this-

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

、その後(nusoap)

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

あなたは$クライアント - > send()メソッドで、プレーン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

それはあなたがCURLでXMLを投稿してみてください仕事をdoes't場合。

関連する問題