0

我必须以以下格式发送 SOAP 请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acc="...">
   <soapenv:Header/>
   <soapenv:Body>
      <acc:CreateChildSubscriptionAccount>
         <account>
            ...
         </account>
         <accountHierarchy>
            ...
         </accountHierarchy>
      </acc:CreateChildSubscriptionAccount>
   </soapenv:Body>
</soapenv:Envelope>

令人困惑的一点是如何使 account 和 accountHierarchy 在请求正文中处于同一级别。

我试过这样,这样:

sub callservice{
    ...
    $params =
        SOAP::Data->name(
            'accountHierarchy' => \SOAP::Data->value(

                SOAP::Data->name( 'customerId' => '250001' ),

                SOAP::Data->name( 'currencyCodeId' => \SOAP::Data->value(

                    SOAP::Data->name( 'domain' => 'ACC' ),
                    SOAP::Data->name( 'value' => 'EUR' )

                ) )
            )
        ),

        SOAP::Data->name(
            'account' => \SOAP::Data->value(

                SOAP::Data->name( 'customerId' => '250001' ),

                SOAP::Data->name( 'languageCodeId' => \SOAP::Data->value(

                    SOAP::Data->name( 'domain' => 'ACC' ),
                    SOAP::Data->name( 'value' => 'en' )

                ) ),

                SOAP::Data->name( 'lifeCycleProgression' => \SOAP::Data->value(

                    SOAP::Data->name( 'lifeCycleEntry' => \SOAP::Data->value(
                        SOAP::Data->name( 'lifeCycleSubState'=> 'STD' ),
                        SOAP::Data->name( 'lifeCycleReasonCode'=> 'ADD' ),
                        SOAP::Data->name( 'lifeCycleState'=> 'ACTIVE' )
                    ) )

                )),

                SOAP::Data->name( 'paymentResponsibility' => 'true' ),

                SOAP::Data->name( 'accountName' => 'TLA13134' ),

                SOAP::Data->name( 'accountType' => 'CONVERGENT' )

            )
        );

    $response = $service->call("createChildSubscriptionAccount", $params);
}

但它失败了,因为它只发送结构中定义的最后一个 SOAP::Data->valueaccountHierarchy在这种情况下的结构中定义的最后一个 SOAP::Data->value。

有人会足够好心,让我知道我怎样才能在同一级别发送account两者吗?accountHierarchy

4

2 回答 2

0

答案是在顶部使用非参考 SOAP::Data->value...

sub callservice{
...
$params =
    SOAP::Data->value(
      SOAP::Data->name(
        'accountHierarchy' => \SOAP::Data->value(

            SOAP::Data->name( 'customerId' => '250001' ),

            SOAP::Data->name( 'currencyCodeId' => \SOAP::Data->value(

                SOAP::Data->name( 'domain' => 'ACC' ),
                SOAP::Data->name( 'value' => 'EUR' )

            ) )
        )
    ),

    SOAP::Data->name(
        'account' => \SOAP::Data->value(

            SOAP::Data->name( 'customerId' => '250001' ),

            SOAP::Data->name( 'languageCodeId' => \SOAP::Data->value(

                SOAP::Data->name( 'domain' => 'ACC' ),
                SOAP::Data->name( 'value' => 'en' )

            ) ),

            SOAP::Data->name( 'lifeCycleProgression' => \SOAP::Data->value(

                SOAP::Data->name( 'lifeCycleEntry' => \SOAP::Data->value(
                    SOAP::Data->name( 'lifeCycleSubState'=> 'STD' ),
                    SOAP::Data->name( 'lifeCycleReasonCode'=> 'ADD' ),
                    SOAP::Data->name( 'lifeCycleState'=> 'ACTIVE' )
                ) )

            )),

            SOAP::Data->name( 'paymentResponsibility' => 'true' ),

            SOAP::Data->name( 'accountName' => 'TLA13134' ),

            SOAP::Data->name( 'accountType' => 'CONVERGENT' )

        )
    )
);

$response = $service->call("createChildSubscriptionAccount", $params);
}

非常感谢!

于 2014-08-07T15:06:45.800 回答
0

现在它已经格式化,问题变得更加明显。

您正在为 scalar 分配两个值$params,并且仅使用最后一个值,因为这是逗号运算符评估的最后一个语句。我的SOAP::Lite知识非常生疏,所以我不确定您是否可以将两者都包装在数组 ref 中:

$params = [
    SOAP::Data->name( accountHierarchy => ... ),
    SOAP::Data->name( account => ... ),
];

或者您是否必须使用适当的SOAP::Lite机制来创建一些匿名数组。但这会让你重新开始。

于 2014-08-07T13:28:50.623 回答