【问题标题】:PHP SoapClient Multiple Arguments with the same name?PHP SoapClient 具有相同名称的多个参数?
【发布时间】:2014-07-21 18:25:21
【问题描述】:

我正在尝试在 PHP 中进行 SOAP 调用,它可以正常工作,但我有疑问:如何根据产品数量的数组将参数传递给 XML 创建新节点?看到这个...

这是我在 SoapUI 中的 XML(重要的部分:ITEMSITM > TITEMSITM。第一个 TITEMSITM 是字段,其他的都是一样的):

   <soapenv:Header/>
   <soapenv:Body>
      <ns:MANUTENCAOSITM>
         <ns:SITM>
            <ns:CABECALHOSITM>
               ...
            </ns:CABECALHOSITM>
            <ns:ITEMSITM>
               <!--Zero or more repetitions:-->
               <ns:TITEMSITM>
                  <ns:CODIGOPRODUTO>0000265</ns:CODIGOPRODUTO>
                  <ns:DESCRICAOPRODUTO>REQ.CAT.0,410 POLI (PL10)</ns:DESCRICAOPRODUTO>
                  <ns:PERCENTUALDESCONTO>-1.03</ns:PERCENTUALDESCONTO>
                  <ns:PESOUNITARIO>0.41</ns:PESOUNITARIO>
                  <ns:PRECOBONIFICADO>10</ns:PRECOBONIFICADO>
                  <ns:PRECOTABELA>9.700</ns:PRECOTABELA>
                  <ns:PRECOUNITARIO>9.6</ns:PRECOUNITARIO>
                  <ns:QUANTIDADEBONIFICADA>20</ns:QUANTIDADEBONIFICADA>
                  <ns:QUANTIDADEVENDA>200</ns:QUANTIDADEVENDA>
                  <ns:SALDOBONIFICADO>0</ns:SALDOBONIFICADO>
                  <ns:TOTALBRUTO>1940.000</ns:TOTALBRUTO>
                  <ns:TOTALLIQUIDO>1920.000</ns:TOTALLIQUIDO>
                  <ns:TOTALPESO>82.000</ns:TOTALPESO>
                  <ns:VALORBONIFICADO>9.700</ns:VALORBONIFICADO>
                  <ns:VALORLIQUIDO>8.9550</ns:VALORLIQUIDO>
               </ns:TITEMSITM>
               <ns:TITEMSITM>
                  ...
               </ns:TITEMSITM>
               <ns:TITEMSITM>
                  ...
               </ns:TITEMSITM>
            </ns:ITEMSITM>
            <ns:RODAPESITM>
               <ns:CRESCIMENTOANTERIOR>?</ns:CRESCIMENTOANTERIOR>
               <ns:TOTALINVESTIMENTO>0.1303</ns:TOTALINVESTIMENTO>
            </ns:RODAPESITM>
         </ns:SITM>
         <ns:TIPOOPERACAO>3</ns:TIPOOPERACAO>
      </ns:MANUTENCAOSITM>
   </soapenv:Body>

我需要在 PHP 中为每个产品重复此节点 (TITEMSITM),但它不起作用,它只存储最后一项,就像我尝试做的下面的代码一样,但是没有成功。

$arguments = array(
    'SITM' => array(
        'CABECALHOSITM' => $pars1,
        'ITEMSITM' => array(
            'TITEMSITM' => $parsItem[0],
            'TITEMSITM' => $parsItem[1],
            'TITEMSITM' => $parsItem[2]
            // ...
        ),
        'RODAPESITM' => $pars2
    ),
    'TIPOOPERACAO' => $pars3
);

$inserirItens = $cliente->MANUTENCAOSITM($arguments);

上面的代码调用没有问题,但是当我 print_rvar_dump $arguments 时,我看到 TITEMSITM 的重复只发送一个产品。我认为这很简单,但我没有得到。有人可以帮帮我吗?

参考资料:

【问题讨论】:

  • 是的,很简单。在 PHP 数组中,一个键只能存在一次。这就是为什么稍后对键 TITEMSITM 的赋值会覆盖前一个(重新阅读 php.net/array 以了解这些基本的 PHP 数组基础知识 - 它不会受到伤害)。所以最后一个赢了。删除最内层数组中的键,然后重试,应该可以工作,但我不完全确定 SOAPClient 和参数的数组表示法。
  • 我把钥匙举例说明我的疑问和我想解决的方法。现在,我只需要知道如何做到这一点,不要覆盖最后的“TITEMSITM”,而是创建新闻“TITEMSITM”并添加产品信息 =/
  • 尝试使用类似'ITEMSITM' =&gt; array('TITEMSITM' =&gt; array($parsItem[0], $parsItem[1], ... ) ... 的方式,这样您就可以通过这些项目的数组获得一次密钥。 IIRC 应该可以工作,但正如我所写的那样,我不是 100% 确定的。自从我上次这样做以来已经有一段时间了。
  • 通过这种方式,它捕获了所有产品的信息,好吧,但不要创建其他'TITEMSITM',它只理解一个项目。 XML 需要用“TITEMSITM”分隔每一个。你知道?感谢 cmets..
  • 是的,我知道,从一开始就很清楚。但如果这不起作用(我看到它是双倍的,你可能会剪掉里面的那个),我没有提示。试一试,你也可以搜索类似的问答。您甚至可以在 cmets 或您的问题中链接此处(顺便说一句,这是一种很好的做法。链接然后解释什么对您有用或没用,这里是一个示例:stackoverflow.com/q/24570784/367456

标签: php arrays xml soap wsdl


【解决方案1】:

这是我使用的代码风格:

$wsdl = 'https://your.api/path?wsdl';
$client = new SoapClient($wsdl);
$multipleSearchValues = [1, 2, 3, 4];
$queryData = ['yourFieldName' => $multipleSearchValues];
$results = $client->YourApiMethod($queryData);
print_r($results);

【讨论】:

    【解决方案2】:
    $ITEMSITM = new stdClass();    
    foreach ($parsItem as $item) {
        $ITEMSITM->TITEMSITM[] = $item;
    }
    

    这应该起作用的原因是因为它将密切模拟您的 WSDL 的数据结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2015-01-14
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      相关资源
      最近更新 更多