gpt4 book ai didi

web-services - 无法识别 Soap 请求消息部分

转载 作者:行者123 更新时间:2023-12-03 14:50:50 25 4
gpt4 key购买 nike

当我向我的网络服务发送请求(使用 apache camel 构建并在 apache karaf 上运行)时,我总是得到

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Message part {http://localhost:8181/cxf/webservices/inputoutput}input was not recognized. (Does it exist in service WSDL?)</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>

我的 wsdl 看起来像这样
<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">

<!-- Type definitions for input- and output parameters for webservice -->
<wsdl:types>
<xs:schema targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">
<xs:element name="input">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="surname"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="output">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="forename"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>

<!-- Message definitions for input and output -->
<wsdl:message name="input">
<wsdl:part name="surname" element="tns:input"/>
</wsdl:message>
<wsdl:message name="output">
<wsdl:part name="forename" element="tns:output"/>
</wsdl:message>

<!-- Port (interface) definitions -->
<wsdl:portType name="InputOutputEndpoint">
<wsdl:operation name="InputOutput">
<wsdl:input message="tns:input"/>
<wsdl:output message="tns:output"/>
</wsdl:operation>
</wsdl:portType>

<!-- Port bindings to transports and encoding - HTTP, document literal encoding is used -->
<wsdl:binding name="InputOutputBinding" type="tns:InputOutputEndpoint">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="InputOutput">
<soap:operation soapAction="http://localhost:8181/cxf/webservices/inputoutput" style="document"/>
<wsdl:input>
<soap:body parts="in" use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body parts="out" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

<!-- Service definition -->
<wsdl:service name="InputOutputEndpointService">
<wsdl:port name="InputOutputEndpoint" binding="tns:InputOutputBinding">
<soap:address location="http://localhost:8181/cxf/webservices/inputoutput"/>
</wsdl:port>
</wsdl:service>

</wsdl:definitions>

这是我在 SoapUI 中的请求
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"    xmlns:rep="http://localhost:8181/cxf/webservices/inputoutput">
<soapenv:Header/>
<soapenv:Body>
<rep:input>
<surname>test</surname>
</rep:input>
</soapenv:Body>
</soapenv:Envelope>

我在这里的 wsdl 中找不到任何错误。任何人都知道是什么导致了这种情况?

最佳答案

我认为问题在于 wsdl 中的目标命名空间和架构中的目标命名空间相同:

<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">

<!-- Type definitions for input- and output parameters for webservice -->
<wsdl:types>
<xs:schema targetNamespace="http://localhost:8181/cxf/webservices/inputoutput">
...

然后在消息部分,当您在 tns:input 中使用“tns”前缀时它无法解析元素:
<wsdl:message name="input">
<wsdl:part name="surname" element="tns:input"/>
</wsdl:message>

您可以尝试定义一个 不同 模式声明中的目标命名空间并在 <wsdl:definitions> 中添加新前缀到那个命名空间。
<?xml version="1.0" encoding="ISO-8859-1"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost:8181/cxf/webservices/inputoutput"
xmlns:types="http://localhost:8181/cxf/webservices/inputoutput/types">

<!-- Type definitions for input- and output parameters for webservice -->
<wsdl:types>
<xs:schema targetNamespace="http://localhost:8181/cxf/webservices/inputoutput/types">
...

然后在消息部分使用这个新前缀:
<wsdl:message name="input">
<wsdl:part name="surname" element="types:input"/>
</wsdl:message>

现在我不记得是否必须为 wsdl 和 types 元素中的架构定义不同的目标命名空间,但我记得遇到过类似的问题,这也被认为是这样做的最佳实践。

我通常至少创建两个模式,一个用于 'in' 参数,另一个用于 'out' 参数,它们都有自己的命名空间以避免可能的名称冲突。

关于web-services - 无法识别 Soap 请求消息部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32624066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com