【问题标题】:Axis 1.4 is not decoding SOAP envelope when HTTP status is 202 - bug or feature?当 HTTP 状态为 202 时,Axis 1.4 未解码 SOAP 信封 - 错误还是功能?
【发布时间】:2012-02-22 11:54:09
【问题描述】:

我正在使用 Axis 1.4 连接到 Web 服务。此服务通过使用带有错误描述和 HTTP 状态代码 202 的 SOAP 信封响应来发出错误信号。响应如下所示:

<soap:Envelope>
<soap:Body>
 <TestResponse>
  <TestResult>wrong format</TestResult>
 </TestResponse>
</soap:Body>
</soap:Envelope>

测试响应在 WSDL 中描述:

  <s:element name="TestResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="TestResult" type="s:string"/>
      </s:sequence>
    </s:complexType>
  </s:element>

所以,在我看来,一切都很好。问题是,我没有收到 Axis 生成的存根的错误消息,而是收到 null。当我调试时,我在HTTPSender class line 705 中找到了该行:

if ((returnCode > 199) && (returnCode < 300)) {
    if (returnCode == 202) {
        return inp;
    }
    // SOAP return is OK - so fall through
} 

它跳过了解码 SOAP 信封的代码。所以,最后,我发送了错误的请求(它可以是任何运行时,例如用户密码过期),我收到错误描述,但是因为我使用 Axis,我无法访问它并且只收到null,这使得调试非常困难(我发布的响应是我使用 Wireshark 找到的)。

我的问题是,它是错误还是功能?是否让 Web 服务滥用 HTTP 状态 202 或标准允许它的公司和 Axis 太原始而无法支持它?充其量我想避免使用来自apache的HttpClient或类似的东西手动编码通信......

【问题讨论】:

    标签: java web-services wsdl axis http-status-codes


    【解决方案1】:

    这看起来像一个错误。 HTTP 202 Accepted 状态码用于指示请求已被接受,但需要进一步处理才能完成它。响应应该有一个Location 标头,表示可以对服务进行的回调,以检查请求状态,以及带有描述性消息的可选正文。

    对于 Web 服务,我希望服务实现者处理主体响应,只要其内容与服务合同(在本例中为 WSDL)相匹配。但是 Axis 的实现者可能会有不同的感受。

    无论如何,供应商错误地使用 202 状态码来返回错误,这是问题的(很大)部分。

    【讨论】:

    • 所以可能两者都有错误,但问题是,如何处理它?修改 Axis 源是否足够解决方案?
    • 您可能需要修补 Axis。看起来他们对自 2005 年以来尚未解决的 1.x 分支有一个未解决的请求 - issues.apache.org/jira/browse/AXIS-1845
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多