Boa Tarde,
Hoje de manhã estava discutindo com meu chefe sobre a necessidade de criar um Web Service para atender uma certa lógica de negocio
Exemplo XML:
<xml>
<req id="1">
<cliente id="123"/>
<solicitacoes size="5">
<solicitacao id="1" value="10"/>
<solicitacao id="2" value="12"/>
<solicitacao id="3" value="14"/>
<solicitacao id="4" value="16"/>
<solicitacao id="5" value="18"/>
</solicitacoes
></req>
</xml>
O Web Service vai receber esse xml, e utilizar o atributo “solicitacoes” para aplicar uma regra de negocio.
Agora bateu a duvida, qual a melhor forma de fazer esse xml chegar até o Web Service ? E como o Web Service vai receber esse xml ?
O cliente deve enviar o xml para o Web Service (Upload) ? Assim nao tem porque utilizar Web Service, pode ser apenas um Servlet que gerencie uploads… concordam?
Lembrando que essa aplicacao vai ser utilizada por sistemas que conhecem apenas o padrao do xml.
Estou pesquisando pela melhor solução a implementar, aceito sugestões. 
Renan :?: :lol:
Em geral, Web Services usam SOAP sobre HTTP, ou seja, o SOAP já é um XML. Use as ferramentas adequadas para gerar e trafegar o XML, você não precisar criar um.
Agora, se o seu caso é passar um XML para um Web Service (mesmo que seja SOAP sobre HTTP), você terá de passá-lo como Attachment (anexo).
Isso se você quiser ater-se aos padrões de mercado dos Web Services.
Senão, pode usar Web Services REST, ou então bolar o seu próprio Servlet que faz isso.
Mas já existem ferramentas e APIs que fazem o trabalho chato para você.
Ola, implementei um servlet que trata as requisicoes.
Ainda estou testando, mas a ideia principal ficou assim:
@SuppressWarnings("unchecked")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String sucess = "<result>sucess</resul>";
String error = "<error>Error</error>";
String result = sucess;
if (request.getContentLength() > 0) {
try {
DocumentBuilder docBuilder = XMLParserUtils.getXMLDocBuilder();
Document document = docBuilder.parse(request.getInputStream());
if (document == null) {
System.out.println(" Document null");
return;
}
Envelope envelope = Envelope.unmarshall(document.getDocumentElement());
Body body = envelope.getBody();
Vector bodyEntries = body.getBodyEntries();
StringWriter writer = new StringWriter();
Enumeration ob = bodyEntries.elements();
if (ob.hasMoreElements()) {
Element element = (Element) ob.nextElement();
DOM2Writer.serializeAsXML(element.getElementsByTagName("processamentoLote").item(0), writer, false);
try {
ProcessamentoLotePedido proce = TreatXML.readProcessamentoLotePedido(writer.toString());
System.out.println(proce);
} catch (Exception e) {
result = error;
}
}
} catch (SAXException e) {
result = error;
}
}
response.setContentType("text/xml");
response.getWriter().append(result);
response.getWriter().flush();
}
XML:
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Header>
<jaws:MessageHeader xmlns:jaws="processamentoLote">
<From>asdfsdafsda</From>
<To>You</To>
<MessageId>9999</MessageId>
</jaws:MessageHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<processamentoLote>
<cdEmp>123456</cdEmp>
<dtEnvio>2008-08-18 15:19:52.953 BRT</dtEnvio>
<arrPedido class="list">
<pedido>
<cdPedido>12</cdPedido>
<cdCliente>10</cdCliente>
<dtPedido>2008-08-18 15:19:52.953 BRT</dtPedido>
<dtConfirmacao>2008-08-18 15:19:52.953 BRT</dtConfirmacao>
<arrItem class="list">
<item>
<cdItem>0</cdItem>
<vlItem>40.0</vlItem>
</item>
<item>
<cdItem>1</cdItem>
<vlItem>40.0</vlItem>
</item>
<item>
<cdItem>2</cdItem>
<vlItem>40.0</vlItem>
</item>
<item>
<cdItem>3</cdItem>
<vlItem>40.0</vlItem>
</item>
<item>
<cdItem>4</cdItem>
<vlItem>40.0</vlItem>
</item>
</arrItem>
</pedido>
</arrPedido>
</processamentoLote>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
No xml pego a tag que preciso. E utilizo XStream para montar meu objeto.
DOM2Writer.serializeAsXML(element.getElementsByTagName("processamentoLote").item(0), writer, false);
ProcessamentoLotePedido proce = TreatXML.readProcessamentoLotePedido(writer.toString());
Essa foi a maneira mais simples de popular meus objetos… será que é gambia ?? :?:
Esta api XStream é super util para manipular xml, mas sera que é possivel montar os objetos atraves de um objeto org.w3c.dom.Document ?? Estava lendo a api, mas nao encontrei nada quanto a isso. :?: