[RESOLVIDO!]Web Services Correios com Jquery

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.

[code]
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
    });        
}[/code]

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

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

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.

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

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.

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.

E pra complementar, a chamada JSONP do jQuery seria assim

[code]$.ajax({ type: ‘GET’, url: ‘url.php?callback=?’, dataType: ‘json’, success: function(json) {

});[/code]

[quote=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.[/quote]

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

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…

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

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

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

Consegui!!! :smiley:

[code]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 :slight_smile:

        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 
}[/code]
1 curtida

[quote]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.[/quote]

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.