Я подключаюсь к веб-сервису через Axis 1.4. Эта служба сообщает об ошибке, отправляя конверт SOAP с описанием ошибки и кодом состояния HTTP 202. Ответ выглядит так:
<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
строке класса 705:
if ((returnCode > 199) && (returnCode < 300)) {
if (returnCode == 202) {
return inp;
}
// SOAP return is OK - so fall through
}
Он пропускает код, который декодирует конверт SOAP. Итак, наконец, я отправил неправильный запрос (это может быть что угодно во время выполнения, например, истек срок действия пароля пользователя), я получаю описание ошибки, но поскольку я использую Axis, у меня нет доступа к нему и я получаю только null
, что делает очень трудная отладка (ответ, который я отправил, нашел с помощью Wireshark).
У меня вопрос, это ошибка или особенность? Компания, которая сделала веб-сервис неправильно использующим статус HTTP 202 или стандарт, разрешает это, а Axis слишком примитивен, чтобы поддерживать его? В лучшем случае я хотел бы избежать кодирования связи вручную, используя HttpClient
от apache или чего-либо подобного ....