0

適切な wsdl ベースの SOAP リクエストを作成しようとしていますが、成功しません。必要なものの例を次に示します: soap.xml:

<?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:Header>
      <AuthMember xmlns="http://tempuri.org/">
           <somefield>string</somefield>
      </AuthMember>
  </soap:Header>
  <soap:Body>
      <AuthenticateMember xmlns="http://tempuri.org/" />
  </soap:Body>
</soap:Envelope>

私の結果は次のとおりです: soap.xml:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"             xmlns:ns1="http://tempuri.org/" xmlns:ns2="http://schemas.xmlsoap.org/ws/2002/07/utility">
<SOAP-ENV:Header>
    <ns2:AuthMember>
        <somefield>somefieldvalue</somefield>
    </ns2:AuthMember>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
    <ns1:AuthenticateMember/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

これは私のphpコードです:



    class SoapHeaderAuthMember
    {

        public $somefield;

        public function __construct($somefield)
        {

            $this->somefield = $somefield;        

        }
    }

    $client = new SoapClient( 'https://www.somepage.com/service.asmx?WSDL', 
        array("exceptions"=>0, "trace" => 1 )
    );
    $authMember = new SoapHeaderAuthMember('somefieldvalue');


    $soapHeaders[] = new SoapHeader('http://schemas.xmlsoap.org/ws/2002/07/utility', 'AuthMember', $authMember);
    $client->__setSoapHeaders($soapHeaders);                 

    $client->__soapCall('AuthenticateMember',array());


見る、

1.SOAP-ENV:Envelope の代わりに SOAP-ENV:Envelope を生成する

2.in ヘッダー: AuthMember の代わりに ns2:AuthMember があります

3.本文には、AuthenticateMember xmlns="http://tempuri.org/" の代わりに ns1:AuthenticateMember があります。

適切な xml を取得するにはどうすればよいですか? 私はphp関数のマニュアルを調べましたが、答えが見つかりません。グーグルでは、私の場合の成功結果は得られませんでした。

助けていただけますか?

4

1 に答える 1

1

生成された結果はコードで要求されたものですが、名前空間のいくつかの属性の説明は次のとおりです。

XMLドキュメント内の各タグには、名前空間とタグ名によって定義される完全修飾形式があります(明示的な名前空間宣言がない「デフォルト」名前空間にある場合でも)。完全修飾バージョンは通常、{namespace}tagとして記述されます。完全修飾名を解決することにより、2つの要素の表現が同じであるかどうかを判断できます。

名前空間は、要素に明示的な名前空間を含めるなど、複数の方法で要素に関連付けられます

Example:
<AuthMember xmlns="http://tempuri.org/">
resolving to fully-qualified name {http://tempuri.org/}AuthMember

名前空間に関連付けられたプレフィックスを介して

Example:
<... xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
resolving to {http://schemas.xmlsoap.org/soap/envelope/}Header

プレフィックスは、プレフィックスが宣言された要素とそれに含まれる要素のスコープ内にあります。使用される実際のプレフィックスは重要ではありません(http://schemas.xmlsoap.org/soap/envelope/名前空間にはsoapSOAP-ENV、またはrandomprefixを使用できます)が、意味のあるものを使用することをお勧めします。

その場合、「desired」ドキュメントと「actual」ドキュメントの完全修飾要素はほぼ同じであり、異常はヘッダー要素AuthMemberです。必要に応じて、完全修飾された{http://tempuri.org/}AuthMemberのhttp://tempuri.org/の名前空間を指定します。実際には、プレフィックスの関連付けにより、完全修飾された{http://schemas.xmlsoap.org/ws/2002/07/utility}AuthMemberになります。

これは、AuthMemberの...utility名前空間を指定するSoapHeaderインスタンス化の結果です。http://tempuri.org/名前空間を使用するようにコード内のそのステートメントを変更すると、実際のドキュメントが目的のドキュメントと一致するはずです。

于 2012-05-10T22:41:22.980 に答える