5

短縮版

SoapClientWSDLにアクセスするときに内部的にこれを行うように拡張したい:

curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl

ロングバージョン

次のような SOAP リクエストがあります。

$serviceUrl = 'https://service-url';
$wsdl = $serviceUrl . '?wsdl';

$proxyServiceUrl = 'http://localhost/myproxy.php?url=$serviceUrl';
$proxyWsdl = 'http://localhost/myproxy.php?url=$wsdl';

$options = array(
  'cache_wsdl'    => WSDL_CACHE_NONE,
  'encoding'      => 'utf-8',
  'soap_version'  => SOAP_1_1,
  'exceptions'    => true,
  'trace'         => true,
  'location'      => $proxyServiceUrl
);

$client = new SoapClient($proxyWsdl, $options);

$params = array( /* */ );
$client->someOperation($params);

ご覧のとおり、プロキシ ビットを除いて、すべてがかなり標準的です。

代理の理由

WSDL を含むすべてのエンドポイントが siteminder と呼ばれる認証システムを介して処理されるという Web サービス プロバイダーの要件を満たすために、プロキシを作成しました。

プロキシの機能は非常に簡単です。Linux コマンド ライン curl で記述した場合、次のようになります。

curl -L -E /location/of/cert.pem -c /tmp/location/of/cookie.jar https://web-service-provider/servicename?wsdl

正確には:

* Follow all redirections
* specify location of .pem file (and password)
* specify location of cookie jar

これはすべて正常に動作します:)

しかし最近、サービス プロバイダーは WSDL を変更することを決定しました。

スキーマ ファイル ( .xsd) をインポートするようになりました。これは、WSDL に関連していることを除けば、それほど悪いことではありません。

WSDL ファイルに相対的であることは、SoapClientパーサーがプロキシの場所からスキーマ ファイルを探すようになったことを意味します。エラー、見つかりません!

その問題の詳細については、次を参照してください。

相対パス スキーマを使用して wsdl を渡すと、php SoapClient が失敗する

だから私の質問は:

どうすれば書き直すことができますかSoapClient(もちろんそれを拡張することによって)、引き続き siteminder 認証を通過しますが、その追加のプロキシを通過する必要はありませんか?

私の最初の考えは、どういうわけか URI アクセサー関数 (存在する場合) を書き直さなければならないということですが、この分野のドキュメントがあまりないため、どこから始めればよいかわかりません。

SoapServerあるいは、何らかの方法でハッキングする必要があるかもしれません。

の内部へのドキュメントへのポインタを含め、私が得ることができる助けをいただければ幸いですSoapClient

4

2 に答える 2

2

この頭を引っ掻く、髪を引っ張る問題への答えはここで見つけることができます:

http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication

これを指摘してくれたphpsoapメーリングリストのJefferyFernandezに感謝します。

于 2011-06-07T08:18:13.560 に答える
2

.pem ファイルを提供するだけの問題であればlocal_cert、SoapClient コンストラクターのオプションを調べましたか? そのクライアント オブジェクトは、セッションに設定されたすべての Cookie を保持する必要があります。セッション間でも Cookie を永続化する必要がある場合は、いつでも応答からそれらを読み取り ( を使用__getLastResponseHeaders)、次に を使用__setCookieして次回再度設定することができます。

または、プロキシを使用して相対パスを絶対パスに置き換えることもできます。結局のところ、wsdl 自体が XML ドキュメントです。

または、プロキシを実際のプロキシに変更して、proxy_host、proxy_port、proxy_login、および proxy_password オプションを使用することもできます。

于 2011-06-06T11:37:10.413 に答える