0

次のような場所に WSDL があります。

https://provider.web-service.domain/path/ServiceName?wsdl

次のような行があります。

<wsdl:import namespace="http://name/space/service/" location="ServiceName.wsdl"></wsdl:import>

すなわち。次の場所で別の wsdl をインポートしようとしています:

https://provider.web-service.domain/path/ServiceName.wsdl

したがって、SoapClient を初期化するときに、次のエラーが発生します。

 PHP Fatal error:  SOAP-ERROR: Parsing WSDL:
 Couldn't load from 'https://provider.web-service.domain/path/ServiceName.wsdl' :
 failed to load external entity "https://provider.web-service.domain/path/ServiceName.wsdl"

現在、WSDL プロバイダーでこの問題を解決しようとしていますが、この問題の回避策はありますか?

唯一の解決策は、アクセス可能なリソースを実際に指すパスを提供することだと思います。そして、実際には、それについて私ができることはあまりありません。

あなたの考え。

関連している:

アップデート

プロバイダーは、PHP SOAP クライアント SUX (本質的に) と言っています。

変更されたタイトル:

  • php SoapClient: 外部エンティティから読み込めませんでした。に
  • php SoapClient: 外部エンティティから読み込めませんでした (エンドポイントが別の場所に解決される場合)

そのため、PHP SoapClient は、wsdl への URL が別の場所に解決されていることを認識しないため、元の場所からファイルをインポートしようとします。

リソースは元の場所に存在しないため、エラーがスローされます。

回避策として、サーバーに配置できるように WSDL が提供されています。

しかし、この問題にはより良い解決策が必要です。

更新 2

明確にするために、質問を言い換えたいと思います。

次の WSDL URL を使用するように依頼されました。

[1] https://provider.web-service.domain/path/ServiceName?wsdl

次の場所に 2 つの WSDL があります。

[2] https://provider.web-service.domain/path/ServiceName/another/diff/path/prefix_ServiceName.wsdl
[3] https://provider.web-service.domain/path/ServiceName/another/diff/path/ServiceName.wsdl
  • [1] は [2] に解決されます。それで
  • [2]輸入[3]

[1] を SoapClient() に渡すと、FATAL になります (前述のとおり)。

[2] を SoapClient() に渡すと動作します。

4

1 に答える 1

1

過去に私がしなければならなかったこと、そして本当に時間を費やしたい場合にできることは、soapclient のラッパー クラスを作成し、wsdls を前処理することです。例えば

class SoapClientCompatibility extends SoapClient{

    public function __construct($wsdl, $options){
        // do things here, like:
        // download the wsdl using curl
        // modify/check it, then hand it over as the $wsdl to parent::__construct
    }

}
于 2014-06-04T20:30:51.387 に答える