PHP SOAP 客户端分配了错误的命名空间

发布于 2025-01-11 14:15:41 字数 2363 浏览 0 评论 0原文

我对 SOAP 几乎没有经验。我正在与第三方 wsdl Web 服务交互。为此,我使用 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 为 List 和 Item 节点分配了错误的命名空间别名。

澄清一下,这是有效的 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>

我不知道如何继续,如何修复命名空间的错误分配?

I have little to no experience in SOAP. And I am interacting with a third party wsdl web service. For this I use PHP's native SoapClient.

When I send the request I'm getting an error response that states the following:

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.

The relevant parts of the autogenerated XML are as follow:

<?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>

If I take the autogenerated XML, change the namespace alias for the List and Item nodes from ns3 to ns1, and send it through postman, it works like a charm.

I think the problem is that both the ns1 namespace and ns2 namespace have a specification for a ScheduleP, List and Item. and the PHP SoapClient is assigning the wrong namespace alias to the List and Item nodes.

Just for clarification, this is the XML that works:

<?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>

I have no idea on how to proceed, how can one fix this miss-assignation of namespaces?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜柠檬 2025-01-18 14:15:41

找到了解决方案。
由于我有一个扩展 PHP 的 SoapClient 的类,因此我可以重写 __doRequest() 函数,该函数接收生成的 XML 字符串作为其第一个参数,然后您可以对该字符串应用任何修改,最后调用 Parent::__doRequest() 来发送它。

Found a solution.
Since I have a class that extends PHP's SoapClient, I can override the __doRequest() function which receives the generated XML String as its first parameter, then you can apply any modification to that string and finally call parent::__doRequest() to send it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文