SOAP-ERROR:解析WSDL:调用SAP PI时在PHP SoapClient中需要未知的WSDL扩展'http://schemas.xmlsoap.org/ws/2004/09/policy'

问题描述 投票:12回答:4

我正在尝试实现在SAP PI系统上运行的Web服务。我得到的WSDL如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="request_SO" targetNamespace="http://company.ch/orstest/jason_test" xmlns:p1="http://company.ch/orstest/jason_test" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <wsdl:documentation/>
    <wsp:UsingPolicy wsdl:required="true"/>
    <wsp:Policy wsu:Id="OP_request_SO"/>
    <wsdl:types>
        <xsd:schema targetNamespace="http://company.ch/orstest/jason_test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://company.ch/orstest/jason_test">
            <xsd:element name="request" type="request"/>
            <xsd:element name="response" type="response"/>
            <xsd:complexType name="request">
                <xsd:annotation>
                    <xsd:appinfo source="http://sap.com/xi/VersionID">a8b7948ac2e211e2b2380000001f0d6a</xsd:appinfo>
                </xsd:annotation>
                <xsd:sequence>
                    <xsd:element name="body" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
            <xsd:complexType name="response">
                <xsd:annotation>
                    <xsd:appinfo source="http://sap.com/xi/VersionID">bf49af09c36c11e299790000001f0d6a</xsd:appinfo>
                </xsd:annotation>
                <xsd:sequence>
                    <xsd:element name="body" type="xsd:string"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="request">
        <wsdl:documentation/>
        <wsdl:part name="request" element="p1:request"/>
    </wsdl:message>
    <wsdl:message name="response">
        <wsdl:documentation/>
        <wsdl:part name="response" element="p1:response"/>
    </wsdl:message>
    <wsdl:portType name="request_SO">
        <wsdl:documentation/>
        <wsdl:operation name="request_SO">
            <wsdl:documentation/>
            <wsp:Policy>
                <wsp:PolicyReference URI="#OP_request_SO"/>
            </wsp:Policy>
            <wsdl:input message="p1:request"/>
            <wsdl:output message="p1:response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="request_SOBinding" type="p1:request_SO">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
        <wsdl:operation name="request_SO">
            <soap:operation soapAction="http://sap.com/xi/WebService/soap1.1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
            <wsdl:input>
                <soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="request_SOService">
        <wsdl:port name="HTTP_Port" binding="p1:request_SOBinding">
            <soap:address location="http://qa1100ap601.company.car.web:50000/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=BS_ORS&amp;receiverParty=&amp;receiverService=&amp;interface=request_SO&amp;interfaceNamespace=http://company.ch/orstest/jason_test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
        </wsdl:port>
        <wsdl:port name="HTTPS_Port" binding="p1:request_SOBinding">
            <soap:address location="https://qas.soa.subcompany.company.ch/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=BS_ORS&amp;receiverParty=&amp;receiverService=&amp;interface=request_SO&amp;interfaceNamespace=http://company.ch/orstest/jason_test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

我的PHP文件看起来像这样(当前没有任何内容:

<?php 
$client = new SoapClient('test.wsdl');
?> 

运行脚本时,抛出以下错误:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Unknown required WSDL extension 'http://schemas.xmlsoap.org/ws/2004/09/policy' in /srv/www/htdocs/wsdl.php:2 Stack trace: #0 /srv/www/htdocs/wsdl.php(2): SoapClient->SoapClient('test.wsdl') #1 {main} thrown in /srv/www/htdocs/wsdl.php on line 2

我曾尝试在google和StackOverflow上搜索错误,还检查了php.net上的注释,但我似乎无法弄清楚为了使此服务运行而必须进行的更改。我还尝试打开W​​SDL扩展URL,它似乎存在。

有人可以在这里扔我一块骨头吗?我尝试删除扩展URL,这导致以下错误:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Unexpected WSDL element <UsingPolicy> in /srv/www/htdocs/wsdl.php:2 Stack trace: #0 /srv/www/htdocs/wsdl.php(2): SoapClient->SoapClient('test.wsdl') #1 {main} thrown in /srv/www/htdocs/wsdl.php on line 2
php wsdl sap sap-xi sap-pi
4个回答
19
投票

目前我唯一想到的解决方案是更新您的UsingPolicy标签:

更改标签:

<wsp:UsingPolicy wsdl:required="true"/> 

对此:

<wsp:UsingPolicy wsdl:required="false"/>

16
投票

这在SAP环境中并不是真正正确的答案。在WSDL的URL中,您将看到/ws_policy/-将其更改为/standard/,您将能够使用PHP SoapClient类使用Web服务,而不必维护WSDL的本地修改副本。您可以在SAP博客here上看到相同的内容(可能需要登录)。


8
投票

对于新版本,URL不再包含“ ws_policy”而是有一个0(标准)或1(策略)

示例:

.... wsdl / flv_10002A1 1 1AD1 / bndg_url / ....(ws_policy)

.... wsdl / flv_10002A1 0 1AD1 / bndg_url /...。(标准)

[C0的积分]


0
投票

[似乎是PHP SOAPServer中的错误,或缺少扩展兼容性,并且至少在PHP 5.6.31中尚未解决。

我唯一能找到的解决方案是按照接受的响应中的建议将所需的Rafa Martinez设置为UsingPolicy

false

但是客户端可以在不进行身份验证的情况下访问SOAP服务,这是一个严重的安全问题。因此,我尝试手动检查客户端是否发送了安全数据。

<wsp:UsingPolicy wsdl:required="false" />

这是一个肮脏的把戏,但是有效。

© www.soinside.com 2019 - 2024. All rights reserved.