SOAP的请求xml不包含PHP 7上的对象数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SOAP的请求xml不包含PHP 7上的对象数组相关的知识,希望对你有一定的参考价值。
在使用php7移动到新服务器之后,SOAP停止生成XML请求中传输对象中包含的元素之一。
链接到WSDL文件:WSDL to test WebApi
以及生成传递给SOAP的对象的示例代码:
$shipment = new addShipment();
$P = new przesylkaBiznesowaType();
$A = new adresType();
$adres = new adresType();
$adres->miejscowosc = "Gdynia";
$adres->kodPocztowy = "81-301";
$adres->kraj = "Polska";
$adres->nazwa = "Jan Kowalski";
$adres->ulica = "10 Lutego";
$adres->numerDomu = "10";
$adres->email = "jan.kowalski@mailowo.pl";
$adres->mobile = "510000000";
$P->adres = $adres;
$P->opis = "";
$P->masa = "500";
$P->wartosc = "600";
$P->ostroznie = true;
$P->gabaryt = gabarytBiznesowaType::XL;
unset($P->urzadWydaniaEPrzesylki);
$subPrzesylka1 = new subPrzesylkaBiznesowaType();
$subPrzesylka1->guid = getGuid();
$subPrzesylka1->gabaryt = gabarytBiznesowaType::M;
$subPrzesylka1->masa = 4233;
$subPrzesylka1->ostroznie = false;
$subPrzesylka1->opis = "";
$subPrzesylka2 = new subPrzesylkaBiznesowaType();
$subPrzesylka2->guid = getGuid();
$subPrzesylka2->gabaryt = gabarytBiznesowaType::L;
$subPrzesylka2->masa = 4233;
$subPrzesylka2->ostroznie = false;
$subPrzesylka2->opis = "";
$subPrzesylka3 = new subPrzesylkaBiznesowaType();
$subPrzesylka3->guid = getGuid();
$subPrzesylka3->gabaryt = gabarytBiznesowaType::XXL;
$subPrzesylka3->masa = 4233;
$subPrzesylka3->ostroznie = false;
$subPrzesylka3->opis = "";
$subPrzesylka4 = new subPrzesylkaBiznesowaType();
$subPrzesylka4->gabaryt = gabarytBiznesowaType::S;
$subPrzesylka4->masa = 4233;
$subPrzesylka4->guid = getGuid();
$subPrzesylka4->ostroznie = false;
$subPrzesylka4->opis = "";
$subPrzesylka5 = new subPrzesylkaBiznesowaType();
$subPrzesylka5->guid = getGuid();
$subPrzesylka5->gabaryt = gabarytBiznesowaType::M;
$subPrzesylka5->masa = 4233;
$subPrzesylka5->ostroznie = false;
$subPrzesylka5->opis = "";
$P->subPrzesylka = array(
$subPrzesylka1,
$subPrzesylka2,
$subPrzesylka3,
$subPrzesylka4,
$subPrzesylka5 );
$shipment->guid = getGuid();
$P->guid = $this->guid;
$shipment->przesylki[] = $P;
$E = new ElektronicznyNadawca();
$result = $E->addShipment($shipment);
在示例代码中,我使用了来自此存档的文件ElektronicznyNadawca.php中定义的classess:webapi specification
对象看起来像这样:
addShipment Object
(
[przesylki] => Array
(
[0] => przesylkaBiznesowaType Object
(
[pobranie] =>
[subPrzesylka] => Array
(
[0] => subPrzesylkaBiznesowaType Object
(
[ubezpieczenie] =>
[numerNadania] =>
[masa] => 4233
[gabaryt] => M
[wartosc] =>
[ostroznie] =>
[guid] => 9419B78744013A2F06A503F2A32AA977
[opis] =>
)
[1] => subPrzesylkaBiznesowaType Object
(
[ubezpieczenie] =>
[numerNadania] =>
[masa] => 4233
[gabaryt] => L
[wartosc] =>
[ostroznie] =>
[guid] => 0F10CB861668B705C657A3C567924E00
[opis] =>
)
[2] => subPrzesylkaBiznesowaType Object
(
[ubezpieczenie] =>
[numerNadania] =>
[masa] => 4233
[gabaryt] => XXL
[wartosc] =>
[ostroznie] =>
[guid] => F3DC09C9090CD62FCCD56B55BDD9373A
[opis] =>
)
[3] => subPrzesylkaBiznesowaType Object
(
[ubezpieczenie] =>
[numerNadania] =>
[masa] => 4233
[gabaryt] => S
[wartosc] =>
[ostroznie] =>
[guid] => 730F8E0E7DA0C89F2051651B0F221BBD
[opis] =>
)
[4] => subPrzesylkaBiznesowaType Object
(
[ubezpieczenie] =>
[numerNadania] =>
[masa] => 4233
[gabaryt] => M
[wartosc] =>
[ostroznie] =>
[guid] => 179E6EB18B16CBE1D44E2640312B0562
[opis] =>
)
)
[ubezpieczenie] =>
[epo] =>
[zasadySpecjalne] =>
[masa] => 500
[gabaryt] => XL
[wartosc] => 600
[ostroznie] => 1
[numerTransakcjiOdbioru] =>
[adres] => adresType Object
(
[nazwa] => Jan Kowalski
[nazwa2] =>
[ulica] => 10 Lutego
[numerDomu] => 10
[numerLokalu] =>
[miejscowosc] => Gdynia
[kodPocztowy] => 81-301
[kraj] => Polska
[telefon] =>
[email] => jan.kowalski@mailowo.pl
[mobile] => 510000000
[osobaKontaktowa] =>
[nip] =>
)
[opis] =>
[guid] => 627EFD182DDBDFEF9E4D263E32E093CC
)
)
[idBufor] => 697283
[guid] => 627EFD182DDBDFEF9E4D263E32E093CC
)
XML请求应如下所示
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://e-nadawca.poczta-polska.pl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:addShipment>
<przesylki guid="1064FEBB36ECA2CB9C04B2163DE14A97" opis="" masa="500" gabaryt="XL" wartosc="600" ostroznie="true" xsi:type="ns1:przesylkaBiznesowaType">
<adres nazwa="Jan Kowalski" ulica="10 Lutego" numerDomu="10" miejscowosc="Gdynia" kodPocztowy="81-301" kraj="Polska" email="jan.kowalski@mailowo.pl" mobile="510000000"/>
<subPrzesylka guid="134571C05EBAB5125D2205E52C6D3309" opis="" masa="4233" gabaryt="M" ostroznie="false"/>
<subPrzesylka guid="173E430572FF57276A1CAE125BB5D703" opis="" masa="4233" gabaryt="L" ostroznie="false"/>
<subPrzesylka guid="134FF717F643F51F7BF4126A5668D5A8" opis="" masa="4233" gabaryt="XXL" ostroznie="false"/>
<subPrzesylka guid="1584130F49408A45D375F73DC483485A" opis="" masa="4233" gabaryt="S" ostroznie="false"/>
<subPrzesylka guid="1E3E081414818276A842AAE255ABC68C" opis="" masa="4233" gabaryt="M" ostroznie="false"/>
</przesylki>
<idBufor>20279201</idBufor>
</ns1:addShipment>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但它没有注入'subPrzesylka'元素,它看起来像这样:
<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://e-nadawca.poczta-polska.pl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap-env:body>
<ns1:addshipment>
<przesylki guid="2E367E17EEE4DC52FFF47F7170769F21" opis="" masa="500" gabaryt="XL" wartosc="600" ostroznie="true" xsi:type="ns1:przesylkaBiznesowaType">
<adres nazwa="Jan Kowalski" ulica="10 Lutego" numerdomu="10" miejscowosc="Gdynia" kodpocztowy="81-301" kraj="Polska" email="jan.kowalski@mailowo.pl" mobile="510000000"></adres>
</przesylki>
<idbufor>697283</idbufor>
</ns1:addshipment>
</soap-env:body>
</soap-env:envelope>
相同的代码适用于使用php 5.3和5.6的旧服务器。看起来php 7上的SOAP无法识别WSDL定义的这一部分:
<xsd:choice>
<xsd:element name="urzadWydaniaEPrzesylki" type="tns:urzadWydaniaEPrzesylkiType" maxOccurs="1" minOccurs="0" />
<xsd:element name="subPrzesylka" type="tns:subPrzesylkaBiznesowaType" minOccurs="4" maxOccurs="unbounded" />
</xsd:choice>
在
<xsd:complexType name="przesylkaBiznesowaType">
<xsd:complexContent>
<xsd:extension base="tns:przesylkaRejestrowanaType">
<xsd:sequence>
<xsd:element name="pobranie" type="tns:pobranieType" maxOccurs="1" minOccurs="0" />
<xsd:choice>
<xsd:element name="urzadWydaniaEPrzesylki" type="tns:urzadWydaniaEPrzesylkiType" maxOccurs="1" minOccurs="0" />
<xsd:element name="subPrzesylka" type="tns:subPrzesylkaBiznesowaType" minOccurs="4" maxOccurs="unbounded" />
</xsd:choice>
<xsd:element name="ubezpieczenie" type="tns:ubezpieczenieType" maxOccurs="1" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="masa" type="tns:masaType" />
<xsd:attribute name="gabaryt" type="tns:gabarytBiznesowaType" />
<xsd:attribute name="wartosc" type="tns:wartoscType" />
<xsd:attribute name="ostroznie" type="xsd:boolean" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="subPrzesylkaBiznesowaType">
<xsd:complexContent>
<xsd:extension base="tns:przesylkaType">
<xsd:sequence>
<xsd:element name="pobranie" type="tns:pobranieType" maxOccurs="1" minOccurs="0" />
<xsd:element name="ubezpieczenie" type="tns:ubezpieczenieType" maxOccurs="1" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="numerNadania" type="tns:numerNadaniaType" />
<xsd:attribute name="masa" type="tns:masaType" />
<xsd:attribute name="gabaryt" type="tns:gabarytBiznesowaType" />
<xsd:attribute name="wartosc" type="tns:wartoscType" />
<xsd:attribute name="ostroznie" type="xsd:boolean" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
我花了好几个小时试图搞清楚。有谁知道这里可能出现什么问题?
答案
这是PHP 7.X中的一个错误。您应该在bugs.php.net上报告它.BTW CHOICE是WSDL文件中的有效结构。官方文件中描述。
以上是关于SOAP的请求xml不包含PHP 7上的对象数组的主要内容,如果未能解决你的问题,请参考以下文章
PHP/SOAP/XML 文档中根元素之前的标记必须格式正确
如何设置soap请求对象为 application/soap+xml;charset=utf-8