У меня ОШИБКА: 'Пространство имен для префикса' soapenv 'не объявлено.' в ответе на вызов веб-службы.
Я использую SpringServiceTemplate, чтобы сделать запрос и получить ответ с этим кодом.
public String getRegistroUnico() {
String xmlRequest = this.getPeticion();
StreamSource peticion = new StreamSource(new StringReader(xmlRequest));
DOMResult respuesta = new DOMResult();
String numeroRU = null;
boolean hayRespuesta = webServiceTemplate.sendSourceAndReceiveToResult(URI, peticion, respuesta);
if (hayRespuesta){
numeroRU = this.resultToRegistroUnico((Document) respuesta.getNode());
}
return numeroRU;
}
/**
* @return Genera la petición (payload) que se enviará al servicio Web
*/
private String getPeticion(){
StringBuffer buffer = new StringBuffer(1024);
buffer.append("<ws:RegistrarEntrada xmlns:ws=\"http://ws.rtaws.rtaws.jccm.es\"> ");
buffer.append("<sUsuario>user</sUsuario>");
buffer.append("<sClave>pass</sClave>");
buffer.append("<strXML>");
buffer.append("<Datos>DATA</Datos>");
buffer.append("</strXML>");
buffer.append("</ws:RegistrarEntrada>");
return buffer.toString();
}
/**
* @return Devuelve una lista de Libro a partir del DOM
*/
private String resultToRegistroUnico(Document doc){
NodeList nodos = doc.getFirstChild().getChildNodes();
Node current = null;
String numeroRU = null;
for (int i = 0, num = nodos.getLength(); i < num; i++){
current = nodos.item(i);
System.out.println(current);
}
return numeroRU;
}
Я собрал данные с помощью WireShark, и это результат.
Запрос (wireshark)
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header/>
<env:Body>
<ws:RegistrarEntrada xmlns:ws="http://ws.rtaws.rtaws.jccm.es">
<sUsuario>user</sUsuario>
<sClave>pass</sClave>
<strXML>
<Datos>DATA</Datos>
</strXML>
</ws:RegistrarEntrada>
</env:Body>
</env:Envelope>
Ответ (wireshark)
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:RegistrarEntradaResponse soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:ns1="http://ws.rtaws.rtaws.jccm.es">
<ns2:result xmlns:ns2="http://www.w3.org/2003/05/soap-rpc">RegistrarEntradaReturn</ns2:result>
<RegistrarEntradaReturn xsi:type="ns3:string" xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/">
<?xml version="1.0" encoding="iso-8859-1"?><RTA-JCCM></RTA-JCCM>
</RegistrarEntradaReturn>
</ns1:RegistrarEntradaResponse>
</soapenv:Body>
</soapenv:Envelope>
Ответ, выполняющий тот же запрос на SoapUI, совершенно другой
Как вы можете видеть на изображении, в ответе java-кода добавляется строка <ns2:result xmlns:ns2="http://www.w3.org/2003/05/soap-rpc">RegistrarEntradaReturn</ns2:result>
, как вы можете видеть в ответе wireshark, поэтому я думаю, что решение может состоять в том, чтобы проанализировать ответ в java-коде для удаления этот узел.
Как я могу это сделать? Это лучшее решение?