Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Ler XML de retorno de webservice

Olá pessoal,

Fiz um sistema simples pra calcular preço e prazo dos correios.

Estou com dificuldades pra mostrar o resultado recebido em XML.

private String getRetornoApi(Encomenda encomenda) throws IOException {
    URL url;
    String json = null;
    URLConnection urlConnection;
    try {
        url = new URL("http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?" + 
                "nCdEmpresa=" + 
                "&sDsSenha=" +
                "&nCdServico=" + encomenda.getTipoServico() +
                "&sCepOrigem=" + encomenda.getCepOrigem() +
                "&sCepDestino=" + encomenda.getCepDestino() + 
                "&nVlPeso=" + encomenda.getPeso() + 
                "&nCdFormato=" + encomenda.getFormato() + 
                "&nVlComprimento=" + encomenda.getComprimento() + 
                "&nVlAltura=" + encomenda.getAltura() + 
                "&nVlLargura=" + encomenda.getLargura() + 
                "&nVlDiametro=" + encomenda.getDiametro() + 
                "&sCdMaoPropria=" + encomenda.getMaoPropria() + 
                "&nVlValorDeclarado=" + encomenda.getValorDeclarado() + 
                "&sCdAvisoRecebimento=" + encomenda.getAvisoRecebimento() + 
                "&StrRetorno=" + encomenda.getRetorno() + 
                "&nIndicaCalculo=" + encomenda.getRetornoCalculo() );
    } catch(MalformedURLException e) {
        throw new RuntimeException(e);
    }


    urlConnection = url.openConnection();
    BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

    String retornoXML = reader.readLine();
    json = retornoXML;
    while( retornoXML != null){
       json += retornoXML;
       retornoXML = reader.readLine();
    }

    return json;        
}

O resto está funcionando, só não estou conseguindo ler o XML e transformar numa String pra mostrar o resultado. Minha intenção seria montar Objetos pra jogar no show.jsp (página onde mostro os resultados).

Alguém ai pode me ajudar? Pesquisei sobre JAX-P, mas não entendi muito bem.

5 respostas

Se quiserem ver o código inteiro: https://github.com/gabriel-plata/java-projects/tree/master/Correios

Se alguém puder me passar um link bom onde explica o JAX-P eu agradeço.

Ou então algum curso do alura onde explica JAX-P.

Obrigado

Oi pessoal,

Usei o seguinte código pra gerar um arquivo XML na minha máquina com o retorno e ele esta vindo certo.

urlConnection = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String inputLine;
File fileXML = new File("retornoXML");
FileWriter f = new FileWriter(fileXML);
while ((inputLine = reader.readLine()) != null) {
    f.write(inputLine);
}
f.close();
reader.close();

retorno:

<?xml version="1.0" encoding="ISO-8859-1" ?><Servicos><cServico><Codigo>40010</Codigo><Valor>21,20</Valor><PrazoEntrega>1</PrazoEntrega><ValorSemAdicionais>21,20</ValorSemAdicionais><ValorMaoPropria>0,00</ValorMaoPropria><ValorAvisoRecebimento>0,00</ValorAvisoRecebimento><ValorValorDeclarado>0,00</ValorValorDeclarado><EntregaDomiciliar>S</EntregaDomiciliar><EntregaSabado>S</EntregaSabado><Erro>0</Erro><MsgErro></MsgErro><obsFim></obsFim></cServico></Servicos>

Minha dificuldade é pegar esse retorno e jogar no show.jsp

Encontrei a solução nesse curso:

https://cursos.alura.com.br/course/webservices-rest-com-jaxrs-e-jersey/

Assim que terminar posto pra vcs como ficou.

solução!

Terminei galera,

Utilizei o XStream para ler do xml e jogar em um objeto para mostar no show.jsp

Acabei que nem usei o JAX-RS. Cheguei a testar com o tomcat 7 (que estou usando), funcionou mas ao transformar o retorno xml em String acontecia a mesma coisa.

Logo tive que salvar o retorno num arquivo e desse arquivo usar o XStream.

URL url;
URLConnection urlConnection;
try {
    url = new URL("http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?" + 
            "nCdEmpresa=" + 
            "&sDsSenha=" +
            "&nCdServico=" + encomenda.getTipoServico() +
            "&sCepOrigem=" + encomenda.getCepOrigem() +
            "&sCepDestino=" + encomenda.getCepDestino() + 
            "&nVlPeso=" + encomenda.getPeso() + 
            "&nCdFormato=" + encomenda.getFormato() + 
            "&nVlComprimento=" + encomenda.getComprimento() + 
            "&nVlAltura=" + encomenda.getAltura() + 
            "&nVlLargura=" + encomenda.getLargura() + 
            "&nVlDiametro=" + encomenda.getDiametro() + 
            "&sCdMaoPropria=" + encomenda.getMaoPropria() + 
            "&nVlValorDeclarado=" + encomenda.getValorDeclarado() + 
            "&sCdAvisoRecebimento=" + encomenda.getAvisoRecebimento() + 
            "&StrRetorno=" + encomenda.getRetorno() + 
            "&nIndicaCalculo=" + encomenda.getRetornoCalculo() );
} catch(MalformedURLException e) {
    throw new RuntimeException(e);
}


urlConnection = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String inputLine;
File fileXML = new File("retornoXML.xml");
FileWriter f = new FileWriter(fileXML);
while ((inputLine = reader.readLine()) != null) {
    f.write(inputLine);
}
f.close();
reader.close();

FileReader fileReader = null;
try {
    //carrega o arquivo XML para um objeto reader
    fileReader = new FileReader("retornoXML.xml");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

XStream xStream = new XStream(new DomDriver());
xStream.alias("Servicos", Servicos.class);
xStream.aliasField("Codigo", CServico.class, "codigo");
xStream.aliasField("Valor", CServico.class, "valor");
xStream.aliasField("PrazoEntrega", CServico.class, "prazoEntrega");
xStream.aliasField("ValorSemAdicionais", CServico.class, "valorSemAdicionais");
xStream.aliasField("ValorMaoPropria", CServico.class, "valorMaoPropria");
xStream.aliasField("ValorAvisoRecebimento", CServico.class, "valorAvisoRecebimento");
xStream.aliasField("ValorValorDeclarado", CServico.class, "valorValorDeclarado");
xStream.aliasField("EntregaDomiciliar", CServico.class, "entregaDomiciliar");
xStream.aliasField("EntregaSabado", CServico.class, "entregaSabado");
xStream.aliasField("Erro", CServico.class, "erro");
xStream.aliasField("MsgErro", CServico.class, "msgErro");
xStream.aliasField("obsFim", CServico.class, "obsFim");
xStream.processAnnotations(Servicos.class);
Servicos servicos = (Servicos) xStream.fromXML(fileReader);

return servicos;

trecho do service: (jogo o objeto no request e uso EL no jsp pra mostrar os resultados)

Servicos retorno = getRetornoApi(encomenda);

request.setAttribute("retorno", retorno);
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/show.jsp");
rd.forward(request, response);