[RESOLVIDO!]Web Services Correios com Jquery

14 respostas
P

Boa noite.

Estou tentando fazer com que eu saiba o valor do frete mas não funciona com a URL que estou colocando. Se eu colocar o arquivo XML no diretório da aplicação, eu consigo pegar o valor do frete.

this.calculateShip = function(){
        var url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?"
        + "nCdEmpresa="
        + "&sDsSenha="
        + "&sCepOrigem=02724070"
        + "&sCepDestino=71939360"
        + "&nVlPeso=1"
        + "&nCdFormato=1"
        + "&nVlComprimento=20"
        + "&nVlAltura=5"
        + "&nVlLargura=15"
        + "&sCdMaoPropria=s"
        + "&nVlValorDeclarado=200"
        + "&sCdAvisoRecebimento=s"
        + "&nCdServico=41106"
        + "&nVlDiametro=0"
        + "&StrRetorno=xml";   
                       
        $.ajax({
            type: "GET",
            url: url, // endereço dos correios com os parâmetros
            dataType: "xml" //retorna um arquivo XML
        }, function (xml) {
            var x = xml, 
            xmlDoc = $.parseXML(x), //analisa o arquivo XML
            $xml = $(xmlDoc), //referencia do arquivo
            $price = $xml.find("Valor");//obtém da chave Valor o preço do frete
            alert($price.text());//alerta o valor
        });        
    }

14 Respostas

V

Que eu saiba não dá pra fazer requisições AJAX para outros domínios externos, a não ser requisições JSONP

P

pois é, mas eles ainda não implementaram resposta pra jsonp, existe alguma forma de fazer esse método funcionar?

P

coloquei

dataType: "jsonp" //retorna um arquivo XML
ai o navegador retorna um erro falando que a expressão não foi terminada, existe alguma forma de analisar o que foi retornado?
Grato.

V

A solução pra vc seria fazer uma requisição pro seu sistema Java, que então faria uma requisição HTTP pro site dos correios e retornaria a resposta dele

P

Hunnmm
pode ser tbm, vou dar uma lida na API do Java pra analisar arquivos XML…
provavelmente deve ter algum construtor que eu coloco a URL não tem? se existir, o cliente vai aceitar a minha requisição e vai me devolver um arquivo .xml de presente?
Grato.

W

na documentação citada aqui: http://www.correios.com.br/webServices/PDF/SCPP_manual_implementacao_calculo_remoto_de_precos_e_prazos.pdf

na página 6 diz:

tenta trocar GET por POST.

V

E pra complementar, a chamada JSONP do jQuery seria assim

$.ajax({ type: 'GET', url: 'url.php?callback=?', dataType: 'json', success: function(json) {

});
V

pqnoje:
Hunnmm
pode ser tbm, vou dar uma lida na API do Java pra analisar arquivos XML…
provavelmente deve ter algum construtor que eu coloco a URL não tem? se existir, o cliente vai aceitar a minha requisição e vai me devolver um arquivo .xml de presente?
Grato.

Não precisa analisar XML no Java, o que retornar da requisição HTTP vc retorna na sua action Java, e aí ao invés do seu código Javascript apontar pro site dos correios apontaria pra sua action. O Java seria tipo um proxy para permitir requisição cross-domain

P

eu troquei pra post e agora ta retornando o endereço exadecimal de um objeto, só não sei o que fazer com esse troço agora.
enquando a requisição via Action eu vou tentar, eu uso Struts2, vou dar uma olhada na API pra ver se tem alguma coisa interessante e já te falo…

P

Não consigo achar nada que me ajude pra fazer requisições em URLs externas, vc sabe alguma classe pra me indicar?
Grato.

V

Sem lib usa-se HttpURLConnection que se instancia a partir de um objeto da classe URL
To saindo agora, se quando voltar vc não tiver conseguido eu posto um exemplo

P

cara, não conseguindo implementar a classe, pode me ajudar? por favor…

P

Consegui!!! :D

public String execute() {
        address = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?"
                + "nCdEmpresa="
                + "&sDsSenha="
                + "&sCepOrigem=02724070"
                + "&sCepDestino=71939360"
                + "&nVlPeso=1"
                + "&nCdFormato=1"
                + "&nVlComprimento=20"
                + "&nVlAltura=5"
                + "&nVlLargura=15"
                + "&sCdMaoPropria=s"
                + "&nVlValorDeclarado=200"
                + "&sCdAvisoRecebimento=s"
                + "&nCdServico=41106"
                + "&nVlDiametro=0"
                + "&StrRetorno=xml";
        HttpURLConnection con = null;
        PrintStream out = null;
        try {
            URL url = new java.net.URL(address); //aqui se define o endereço que devolverá o arquivo
            con = (java.net.HttpURLConnection) url.openConnection();//prepara conexão com o cliente
            con.setUseCaches(false);
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setRequestProperty("Content-Type", "text/xml");//define o tipo de retorno, pode ser outro tipo também
            out = new PrintStream(con.getOutputStream());//obtém o que o cliente devolveu
            BufferedReader buffReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String xml;
            while ((xml = buffReader.readLine()) != null) {
                sb.append(xml);//recebe o arquivo xml do cliente
            }
            System.out.println(sb.toString()); //imprime o xml retornado :)

            out.close(); 
            con.disconnect(); // sempre feche as conexões!
        } catch (Exception e) {
            e.printStackTrace();
            out.close(); 
            con.disconnect(); // sempre feche as conexões!
        }
        return Action.SUCCESS; // para quem usa Struts 2 
    }
P

na documentação citada aqui: http://www.correios.com.br/webServices/PDF/SCPP_ma…_remoto_de_precos_e_prazos.pdf

na página 6 diz:

Neste caso os resultados poderão ser visualizados no formato XML, numa janela popup ou numa página disponível no ambiente do requisitante. Neste último caso o retorno será enviado via post.

tenta trocar GET por POST.

No caso de requisitar XML sem ser de endereço loca, não ś possível, só com Json mesmo. Eu também achava que dava, pois só uso Json em todas as minhas Actions.

Criado 1 de junho de 2012
Ultima resposta 1 de jun. de 2012
Respostas 14
Participantes 3