构建用于使用复杂wsdl的数组 - PHP

时间:2017-12-31 16:10:39

标签: php soap wsdl

我有一些问题,是的,我可能不在我的联盟中,但我这样做是为了学习。

我正在尝试使用SOAP服务,但我不能,因为我的生活中构建了一个服务器接受的数组。

WSDL在这里可见:

http://metrolive.telenor.no/kapaks-facade-soap-web/services/KapaksFacade70SoapWrapper/wsdl

我能做到这一点并且完美无缺:

 $tlf = new SoapVar(
     array(
    new SoapVar(
        array(
            'ns2:connectionNumber' => 12345678,
            'ns2:connectionNumberType' => "T",
            'ns2:requestedProduct' => "OA"
        ), SOAP_ENC_OBJECT, null, null, null, 'http://web.soap.v70.kapaks.facade.metro2.telenor.com'
    )
), SOAP_ENC_OBJECT, null, null, null, 'http://dto.common.v70.kapaks.facade.metro2.telenor.com'
 );

 $client = new SoapClient($kapaks_wsdl, $wsdl_options);
 $result = $client->validateProductSoap($tlf);

这会产生这个xml :(来自wireshark)

 <?xml version="1.0" encoding="UTF-8"?>
 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org /soap/envelope/" 
  xmlns:ns1="http://web.soap.v70.kapaks.facade.metro2.telenor.com"
      xmlns:ns2="http://dto.common.v70.kapaks.facade.metro2.telenor.com">
 <SOAP-ENV:Header/><SOAP-ENV:Body><ns1:validateProductSoap><ns1:BOGUS> 
     <ns2:connectionNumber>12345678</ns2:connectionNumber> 
<ns2:connectionNumberType>T</ns2:connectionNumberType> 
<ns2:requestedProduct>OA</ns2:requestedProduct></ns1:BOGUS> 
</ns1:validateProductSoap></SOAP-ENV:Body></SOAP-ENV:Envelope>

但是,我需要从“地址”节点请求属性(是节点吗?)。我无法弄清楚如何将其映射到数组中,我已经在这里待了好几天......

这个XML适用于curl :(来自SoaP-UI的Straigt)

  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 

  xmlns:web="http://web.soap.v70.kapaks.facade.metro2.telenor.com"  

   xmlns:dto="http://dto.common.v70.kapaks.facade.metro2.telenor.com">
   <soapenv:Header/>
   <soapenv:Body>
  <web:validateProductSoap>
     <web:arg_0_0>
        <dto:address>

           <dto:houseLetter>A</dto:houseLetter>
           <dto:houseNumber>12</dto:houseNumber>

           <dto:municipalityNumber>0000</dto:municipalityNumber>

           <dto:streetCodeType>V</dto:streetCodeType>
           <dto:streetName>Street</dto:streetName>
        </dto:address>



        <dto:requestedProduct>OA</dto:requestedProduct>
     </web:arg_0_0>
    </web:validateProductSoap>
   </soapenv:Body>
 </soapenv:Envelope>

curl方法给了我一个xml响应,但是我需要soapclient生成的数组/对象,以便能够将它传递给前端视图。

如何生成一个soapclient请求,该请求将请求地址标记内的内容?或者创建一个与soapclient提供的数组/对象相同的数组/对象?

1 个答案:

答案 0 :(得分:0)

我做了一个解决方法。在这一点上,我并不关心它是如何完成的,只是它完成了。不过,如果有人能够以正确的方式解答如何做到这一点,我希望看到它。

我正在使用nusoap更新为更新的php(https://github.com/econea/nusoap),我发送原始xml。

    function adresse($kmune1,$street1,$hnum1,$hletter1)
                {
                    require '..\vendor\econea\nusoap\src\nusoap.php';



                    $endpoint = "http://user:pw@metrolive.telenor.no:80/kapaks-facade-soap-web/services/KapaksFacade70SoapWrapper";

                    $client2 = new nusoap_client($endpoint, false);
                    $client2->soap_defencoding = 'UTF-8';
                    $client2->decode_utf8 = false;

                    $XMLrequest = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://web.soap.v70.kapaks.facade.metro2.telenor.com" xmlns:dto="http://dto.common.v70.kapaks.facade.metro2.telenor.com">
                   <soapenv:Header/>
                   <soapenv:Body>
                      <web:validateProductSoap>
                         <web:arg_0_0>
                            <dto:address>

                               <dto:houseLetter>'.$hletter1.'</dto:houseLetter>
                               <dto:houseNumber>'.$hnum1.'</dto:houseNumber>

                               <dto:municipalityNumber>'.$kmune1.'</dto:municipalityNumber>

                               <dto:streetCodeType>V</dto:streetCodeType>
                               <dto:streetName>'.$street1.'</dto:streetName>
                            </dto:address>



                            <dto:requestedProduct>OA</dto:requestedProduct>
                         </web:arg_0_0>
                      </web:validateProductSoap>
                   </soapenv:Body>
                </soapenv:Envelope>';


                    $result = $client2->send($XMLrequest, $endpoint, null);




                    $result=json_decode(json_encode($result));
                    return $result;


                }