PHP SOAP 客户端分配了错误的命名空间
Wrong namespaces assigned by PHP SOAP Client
我几乎没有使用 SOAP 的经验。我正在与第三方 wsdl 网络服务进行交互。为此,我使用 PHP 的原生 SoapClient。
当我发送请求时,我收到一条错误响应,内容如下:
Schema validation failed: cvc-complex-type.2.4.b: Content of element 'ns2:ScheduleP' is not complete. '{"http://blabla.com/webservices/offer/request":List}' is expected.
自动生成的XML相关部分如下:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://blabla.com/webservices/offer/request"
xmlns:ns2="http://blabla.com/webservices/datatypes/data"
xmlns:ns3="http://blabla.com/webservices/offer/response"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<SOAP-ENV:Body>
<ns1:OfferRequest>
<ns1:Header us="my-user" sig="42fc731ee1f1c1" tnr="532709" t="20220301120026"/>
<ns1:RequestData>
<ns1:ScheduleP xsi:type="ns3:Schedule">
<ns3:List>
<ns3:Item/>
</ns3:List>
</ns1:ScheduleP>
</ns1:RequestData>
</ns1:OfferRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如果我采用自动生成的 XML,将 List 和 Item 节点的命名空间别名从 ns3 更改为 ns1,并通过邮递员发送,效果非常好。
我认为问题在于 ns1 命名空间和 ns2 命名空间都有一个 ScheduleP、List 和 Item 的规范。 PHP SoapClient 将错误的命名空间别名分配给列表和项目节点。
澄清一下,这是有效的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://blabla.com/webservices/offer/request"
xmlns:ns2="http://blabla.com/webservices/datatypes/data"
xmlns:ns3="http://blabla.com/webservices/offer/response"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<SOAP-ENV:Body>
<ns1:OfferRequest>
<ns1:Header us="my-user" sig="42fc731ee1f1c1" tnr="532709" t="20220301120026"/>
<ns1:RequestData>
<ns1:ScheduleP xsi:type="ns3:Schedule">
<ns1:List>
<ns1:Item/>
</ns1:List>
</ns1:ScheduleP>
</ns1:RequestData>
</ns1:OfferRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我不知道如何继续,如何解决命名空间的这种错误分配?
找到解决办法。
由于我有一个扩展 PHP 的 SoapClient 的 class,我可以覆盖 __doRequest() 函数,该函数接收生成的 XML 字符串作为其第一个参数,然后您可以对该字符串应用任何修改,最后调用 parent::__doRequest() 发送它。
我几乎没有使用 SOAP 的经验。我正在与第三方 wsdl 网络服务进行交互。为此,我使用 PHP 的原生 SoapClient。
当我发送请求时,我收到一条错误响应,内容如下:
Schema validation failed: cvc-complex-type.2.4.b: Content of element 'ns2:ScheduleP' is not complete. '{"http://blabla.com/webservices/offer/request":List}' is expected.
自动生成的XML相关部分如下:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://blabla.com/webservices/offer/request"
xmlns:ns2="http://blabla.com/webservices/datatypes/data"
xmlns:ns3="http://blabla.com/webservices/offer/response"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<SOAP-ENV:Body>
<ns1:OfferRequest>
<ns1:Header us="my-user" sig="42fc731ee1f1c1" tnr="532709" t="20220301120026"/>
<ns1:RequestData>
<ns1:ScheduleP xsi:type="ns3:Schedule">
<ns3:List>
<ns3:Item/>
</ns3:List>
</ns1:ScheduleP>
</ns1:RequestData>
</ns1:OfferRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如果我采用自动生成的 XML,将 List 和 Item 节点的命名空间别名从 ns3 更改为 ns1,并通过邮递员发送,效果非常好。
我认为问题在于 ns1 命名空间和 ns2 命名空间都有一个 ScheduleP、List 和 Item 的规范。 PHP SoapClient 将错误的命名空间别名分配给列表和项目节点。
澄清一下,这是有效的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://blabla.com/webservices/offer/request"
xmlns:ns2="http://blabla.com/webservices/datatypes/data"
xmlns:ns3="http://blabla.com/webservices/offer/response"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<SOAP-ENV:Body>
<ns1:OfferRequest>
<ns1:Header us="my-user" sig="42fc731ee1f1c1" tnr="532709" t="20220301120026"/>
<ns1:RequestData>
<ns1:ScheduleP xsi:type="ns3:Schedule">
<ns1:List>
<ns1:Item/>
</ns1:List>
</ns1:ScheduleP>
</ns1:RequestData>
</ns1:OfferRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我不知道如何继续,如何解决命名空间的这种错误分配?
找到解决办法。 由于我有一个扩展 PHP 的 SoapClient 的 class,我可以覆盖 __doRequest() 函数,该函数接收生成的 XML 字符串作为其第一个参数,然后您可以对该字符串应用任何修改,最后调用 parent::__doRequest() 发送它。