当前位置: 首页 > 知识库问答 >
问题:

为什么信封中没有SOAPAction甚至操作名的SOAP请求仍然有效?

孔永年
2023-03-14

我遇到过一件奇怪的事情:我将SOAP请求发送给SOAP服务提供者,SOAP请求包络没有SOAPAction头,正文中也没有操作名。但反应还是可以的。这是我的WSDL

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:com.tung.switchyard:soap-hello:1.0" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="IHello" targetNamespace="urn:com.tung.switchyard:soap-hello:1.0">
  <wsdl:types>
<xs:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:com.tung.switchyard:soap-hello:1.0" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="urn:com.tung.switchyard:soap-hello:1.0" version="1.0">
<xs:element name="greetingResponse" type="tns:greetingResponse"/>
<xs:element name="person" type="tns:person"/>
<xs:complexType name="person">
    <xs:sequence>
      <xs:element minOccurs="0" name="name" type="xs:string"/>
      <xs:element name="sex" type="xs:boolean"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="greetingResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="response" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
            <xs:element name="NewOperation">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="in" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="NewOperationResponse">
                <xs:complexType>
                    <xs:sequence>

                        <xs:element name="out" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="hello">
    <wsdl:part element="tns:person" name="arg0">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="NewOperationRequest">
    <wsdl:part element="tns:person" name="argo">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="helloResponse">
    <wsdl:part element="tns:greetingResponse" name="return">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="NewOperationResponse">
    <wsdl:part element="tns:greetingResponse" name="return">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="IHelloPortType">
    <wsdl:operation name="hello">
      <wsdl:input message="tns:hello" name="hello">
    </wsdl:input>
      <wsdl:output message="tns:helloResponse" name="helloResponse">
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="NewOperation">
      <wsdl:input message="tns:NewOperationRequest">
    </wsdl:input>
      <wsdl:output message="tns:NewOperationResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="IHelloSoapBinding" type="tns:IHelloPortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="hello">
      <soap:operation soapAction="hello" style="document"/>
      <wsdl:input name="hello">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="helloResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="NewOperation">
      <soap:operation soapAction="NewOperation" style="document"/>
      <wsdl:input name="NewOperationRequest">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="NewOperationResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="IHello">
    <wsdl:port binding="tns:IHelloSoapBinding" name="IHelloPort">
      <soap:address location="http://localhost:8080/soap-hello/IHello"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

请求信封

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:com.tung.switchyard:soap-hello:1.0">
   <soapenv:Header/>
   <soapenv:Body>
      <urn:person>
         <name>John</name><sex>true</sex>
      </urn:person>
   </soapenv:Body>
</soapenv:Envelope>

答复:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
   <soap:Body>
      <greetingResponse xmlns="urn:com.tung.switchyard:soap-hello:1.0">
         <response>Hello John</response>
      </greetingResponse>
   </soap:Body>
</soap:Envelope>

共有1个答案

赖明煦
2023-03-14

在您的WSDL文件中,您提到了这两个服务的soap action属性,并且这两个服务具有相同的请求和响应元素。SOAP操作属性在Http Post报头中发送。当您在没有SOAP操作的情况下发送它时,它将失败。我已经执行了一个测试,下面是日志。

没有SOAP操作

POST /DemoWS/services/IHello HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Host: localhost:8080
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: ""
Content-Length: 375

Request Envelope

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><person xmlns="urn:com.tung.switchyard:soap-hello:1.0"><name xmlns="">Test</name><sex xmlns="">true</sex></person></soapenv:Body></soapenv:Envelope>

Error Response Envelope

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><axis2ns2:Fault xmlns:axis2ns2="http://schemas.xmlsoap.org/soap/envelope/"><faultcode>axis2ns2:Client</faultcode><faultstring>The endpoint reference (EPR) for the Operation not found is http://localhost:8080/DemoWS/services/IHello and the WSA Action = . If this EPR was previously reachable, please contact the server administrator.</faultstring><detail/></axis2ns2:Fault></soapenv:Body></soapenv:Envelope>

使用SOAP操作-它工作得很好

POST /DemoWS/services/IHello HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Host: localhost:8080
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: "NewOperation"
Content-Length: 375

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><person xmlns="urn:com.tung.switchyard:soap-hello:1.0"><name xmlns="">Test</name><sex xmlns="">true</sex></person></soapenv:Body></soapenv:Envelope>
 类似资料:
  • 注意:我不一定要寻找下面描述的具体示例问题的解决方案。我真的很感兴趣,为什么这在java 8中是不可能的。 Java流是懒惰的。最后,他们有一个单一的终端操作<我的解释是,这个终端操作将通过流提取所有值。没有任何中间操作可以做到这一点。为什么没有中间操作通过流拉入任意数量的元素?类似这样: 当下游操作尝试推进流一次时,中间操作可能尝试多次(或根本不推进)上游。 我会看到几个用例: (这些只是示例。

  • 在默认情况下,我希望angular发出请求。不是JSON。 角度1.4.5 如何将整个应用程序配置为使用x-www-form-urlencoded而不使用自行车作为拦截器等。

  • 问题内容: 我正在尝试在机器上安装python 。当我尝试将软件包安装为时。我收到以下错误。 然后我按我的方式提出并安装了请求。但是仍然无法安装。请让我知道我在做什么错误。在此先感谢 问题答案: 该库需要Python 3.3或更高版本 : 要求 […] 第一个软件要求是Python 3.3或更高版本。使用该库是必需的。 和从Trove分类器: 编程语言:: Python 编程语言:: Python

  • 嗨,我正在使用SoapUI Pro来测试一组Soap网络服务。 我有一个 testRunListener,它将我的 soap 请求的请求和响应记录到它在运行测试时创建的文件中。在这里,我有一个if语句,该语句在记录请求和响应之前检查测试步骤的名称.. 而不是使用单个请求的名称,我想使用更通用的东西,例如请求的类型,可以是 createShipping 或 cancelShipping。这是因为我有

  • 我通常是一名c#开发人员,但是现在在Java上工作,我偶尔会看到很多在私有属性上使用Spring的依赖注入,没有设置值的公共方法。我很惊讶这真的有用,但我想通过思考这是可能的? 这肯定是很糟糕的做法吧?!我看不出任何对类进行单元测试或检查的人怎么可能知道私有成员需要从某个外部框架中设置。 当您进行单元测试时,您将如何设置属性?或者只是单独使用类? 我想你必须在你的单元测试中使用spring,这看起

  • 从https://projects.spring.io/spring-framework/,我有一个spring framework hellpworld程序。我删除了注释。然而,程序仍然可以像以前一样运行。为什么?这里的角色是什么?