web-dev-qa-db-ja.com

SOAP:XMLドキュメントがないようです

私は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つだと思いますが、そうではありません。それは私を何時間も怒らせてきました!どんな助けでも大歓迎です。

12
geoffs3310

バイトオーダーマーク(BOM)は、phpタグの前の空白と同じ効果があります。 ここ BOMを検出して削除するPHPスニペットを見つけます。BOMを再度挿入しないようにエディターを設定してください。

6
rik

かなり遅いですが、他の人のために私の修正を追加しています。 Apacheサーバーを2.2から2.4に変更したときにも同様のエラーが発生し、WindowsではPHP 5.4.10から5.6.18になりました。クライアントアプリはphp 5.6.1を使用しました。問題を解決するには、次のことを行った:

  1. SOAPバージョンパラメータをSoapClientに渡しました:

    'soap_version' => SOAP_1_1

  2. サーバーにphp.ini設定ファイルを追加しました:

    always_populate_raw_post_data = -1

6
mvsagar

少し遅いですが、このようなエラーはサーバーサイド(SOAPセンス)の問題が原因で発生することがよくあります。

  • 印刷/エコーコンテンツ
  • リクの答えも
  • 間違い(たとえば、インクルードのファイル名が間違っているためにこのエラーが発生し、スクリプトを実行する代わりにインクルードエラーを生成しました...)
  • SOAPサーバーのパラメータが不正です
  • 両側で同じ圧縮レベルではない(圧縮が使用されている場合)

このメッセージは、SOAPクライアントが適切にフォーマットされたXMLを受信しなかったことを通知するだけです(たとえば、XMLではなくエラーメッセージ)。

4
Benj

このエラーは、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

3
Andrei Zhamoida

セットする always_populate_raw_post_data = -1 php.iniファイル(;)、サーバーを再起動します。それは私にとってはうまくいきました。

3
Ipsita Rout

モデルをロードしているMagento APIを操作しているときにこのエラーを受け取りました。エラーを引き起こしているxml応答を出力する前に警告をスローしていました。

これを修正するには、API関数の警告をオフにするだけです:error_reporting(0);

2
Kus

別の可能な解決策...

私も同じ問題を抱えていて、頭がおかしくなりました。解決策は簡単でした。サーバーを確認しています。原因はサーバーエラーです。私のエラーは、「rpc」の代わりに「rcp」を置いたことです。

1
Vrian7

私が理解している限り、無効なXMLになるとSOAPパーサーのエラーが発生します。

私と同じように。

  1. エラーの表示をオンにする
  2. try-catchおよびcatch呼び出し__getLastResponseで実行
  3. 私は別のエラーをキャッチします:

警告:simplexml_load_string():エンティティ:1行目:パーサーエラー:xmlParseCharRef:無効なxmlChar値26

  1. 最初の患者はPHP5.3でした。 PHP5.4でスクリプトを実行すると、より有益なエラーになりました-おそらく、SOAPパーサーが失敗したため、無効な文字を誓います。

その結果、次のコードを取得しました。

$params = array(...);
try
{
    $response = $client->method( $params );
}
catch(SoapFault $e)
{
    $response = $client->__getLastResponse();
    $response = str_replace("&#x1A",'',$response); ///My Invalid Symbol
    $response = str_ireplace(array('SOAP-ENV:','SOAP:'),'',$response);
    $response = simplexml_load_string($response);
}

誰かがコメントでコメントを教えてくれれば、ありがたいです。

1
borodatych

サーバーログを調べてみてください。 nginxを使用している場合は、/ var/log/nginx/error.logを調べてください。 「許可が拒否されました」というポップアップが表示された場合は、関連するディレクトリの所有者を変更してください。それがうまくいくことを願っています。

0
Boush