私はWebサービスを作成しようとしていますが、その前に、インターネットで最初に機能する単純な例を取得しようとしていますが、次のエラーが発生し続けます。
Fatal error: Uncaught SoapFault exception: [Client] looks like we got no XML document in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php:20 Stack trace: #0 [internal function]: SoapClient->__call('getStockQuote', Array) #1 C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php(20): SoapClient->getStockQuote(Array) #2 {main} thrown in C:\Documents and Settings\geoff\My Documents\Websites\jquery\index.php on line 20
Nusoap v1.94を使用しています
私のWebサービスコードは次のようになります。
function getStockQuote($symbol) {
$price = '1.23';
return $price;
}
require('nusoap.php');
$server = new soap_server();
$server->configureWSDL('stockserver', 'urn:stockquote');
$server->register("getStockQuote",
array('symbol' => 'xsd:string'),
array('return' => 'xsd:decimal'),
'urn:stockquote',
'urn:stockquote#getStockQuote');
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)
? $HTTP_RAW_POST_DATA : '';
$server->service($HTTP_RAW_POST_DATA);
サーバースクリプトのphpタグの前後に空白があることが原因の1つだと思いますが、そうではありません。それは私を何時間も怒らせてきました!どんな助けでも大歓迎です。
バイトオーダーマーク(BOM)は、phpタグの前の空白と同じ効果があります。 ここ BOMを検出して削除するPHPスニペットを見つけます。BOMを再度挿入しないようにエディターを設定してください。
かなり遅いですが、他の人のために私の修正を追加しています。 Apacheサーバーを2.2から2.4に変更したときにも同様のエラーが発生し、WindowsではPHP 5.4.10から5.6.18になりました。クライアントアプリはphp 5.6.1を使用しました。問題を解決するには、次のことを行った:
SOAPバージョンパラメータをSoapClientに渡しました:
'soap_version' => SOAP_1_1
サーバーにphp.ini設定ファイルを追加しました:
always_populate_raw_post_data = -1
少し遅いですが、このようなエラーはサーバーサイド(SOAPセンス)の問題が原因で発生することがよくあります。
このメッセージは、SOAPクライアントが適切にフォーマットされたXMLを受信しなかったことを通知するだけです(たとえば、XMLではなくエラーメッセージ)。
このエラーは、SOAP XML応答に特殊なUnicode文字が含まれている場合にも表示されます。私の場合、それは置換文字(U+FFFD
)でした。
詳細には、SoapClientの内部関数xmlParseDocument
は、解析後にxmlParserCtxtPtr->wellFormed
プロパティをfalse
として設定します。 looks like we got no XML document
でsoap faultをスローします。
https://github.com/php/php-src/blob/master/ext/soap/php_packet_soap.c#L46
セットする always_populate_raw_post_data = -1
php.iniファイル(;
)、サーバーを再起動します。それは私にとってはうまくいきました。
モデルをロードしているMagento APIを操作しているときにこのエラーを受け取りました。エラーを引き起こしているxml応答を出力する前に警告をスローしていました。
これを修正するには、API関数の警告をオフにするだけです:error_reporting(0);
別の可能な解決策...
私も同じ問題を抱えていて、頭がおかしくなりました。解決策は簡単でした。サーバーを確認しています。原因はサーバーエラーです。私のエラーは、「rpc」の代わりに「rcp」を置いたことです。
私が理解している限り、無効なXMLになるとSOAPパーサーのエラーが発生します。
私と同じように。
警告:simplexml_load_string():エンティティ:1行目:パーサーエラー:xmlParseCharRef:無効なxmlChar値26
その結果、次のコードを取得しました。
$params = array(...);
try
{
$response = $client->method( $params );
}
catch(SoapFault $e)
{
$response = $client->__getLastResponse();
$response = str_replace("",'',$response); ///My Invalid Symbol
$response = str_ireplace(array('SOAP-ENV:','SOAP:'),'',$response);
$response = simplexml_load_string($response);
}
誰かがコメントでコメントを教えてくれれば、ありがたいです。
サーバーログを調べてみてください。 nginxを使用している場合は、/ var/log/nginx/error.logを調べてください。 「許可が拒否されました」というポップアップが表示された場合は、関連するディレクトリの所有者を変更してください。それがうまくいくことを願っています。