Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

13
respostas

Não consome Ajax pelo dispositivo

Boa noite,

Terminei o curso de cordova hoje, e por mais que eu tente, não consigo consumir o serviço do cozinhapp pelo device.

Já fiz a instalação do whitelist e até dei uma olhadinha na documentação, sem sucesso.... Abaixo segue meu arquivo XML, que acredito que seja onde o erro está contido, sendo que pelo navegador consigo inserir novos pedidos.

<?xml version='1.0' encoding='utf-8'?>
<widget id="org.ayrtonkrizan.garconapp" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>Garçonete Só de Cenoura</name>
    <description>
        App para uso das garçonetes dentro do restaurante.
    </description>
    <author email="dev@cordova.apache.org" href="http://ayrtonkrizan.org">
        Ayrton Krizan
    </author>
    <preference name="Orientation" value="portrait" />
    <preference name="DesallowOverscroll" value="true" />
    <preference name="BackgroundColor" value="0xF2F2F2FF" />
    <preference name="SplashScreen" value="screen" />
    <preference name="SplashScreenDelay" value="3000" />
    <platform name="android">
        <icon density="ldpi" src="resources\android\icon\drawable-ldpi-icon.png" />
        <icon density="mdpi" src="resources\android\icon\drawable-mdpi-icon.png" />
        <icon density="hdpi" src="resources\android\icon\drawable-hdpi-icon.png" />
        <icon density="xhdpi" src="resources\android\icon\drawable-xhdpi-icon.png" />
        <icon density="xxhdpi" src="resources\android\icon\drawable-xxhdpi-icon.png" />
        <icon density="xxxhdpi" src="resources\android\icon\drawable-xxxhdpi-icon.png" />
        <splash density="port-ldpi" src="resources\android\splash\drawable-port-ldpi-screen.png" />
        <splash density="port-mdpi" src="resources\android\splash\drawable-port-mdpi-screen.png" />
        <splash density="port-hdpi" src="resources\android\splash\drawable-port-hdpi-screen.png" />
        <splash density="port-xhdpi" src="resources\android\splash\drawable-port-xhdpi-screen.png" />
        <splash density="port-xxhdpi" src="resources\android\splash\drawable-port-xxhdpi-screen.png" />
        <splash density="port-xxxhdpi" src="resources\android\splash\drawable-port-xxxhdpi-screen.png" />
    </platform>
    <icon src="resources\android\icon\drawable-xhdpi-icon.png" />
    <platform name="android">
        <preference name="StatusBarBackgroundColor" value="#E86C13" />
    </platform>
    <platform name="ios">
        <preference name="StatusBarOverlaysWebView" value="false" />
        <preference name="StatusBarBackgroundColor" value="#F57F17" />
    </platform>
    <plugin name="phonegap-plugin-barcodescanner" spec="~6.0.5" />
    <plugin name="cordova-plugin-whitelist" spec="~1.3.1" />

    <!-- Libera acesso -->
    <access origin="http://cozinhapp.sergiolopes.org" />
</widget>
13 respostas

Olá.

Acho que está tudo certo com seu XML. Eu só colocaria o a tag access mais no inicio do arquivo, depois do autor.

Posta aqui pra gente, como vc está fazendo a chamada lá no servidor do cozinhapp. Pode ser alguma coisa na chamada que está com problema

Bom dia Lazaro,

Estou encaminhado a chamada, mas lembrando que pelo browser está consumindo direitinho....

//// app.js
.
.
.
$('.acao-finalizar').click(function(){
    $.ajax({
        url:'http://cozinhapp.sergiolopes.org/novo-pedido',
        data:{
            mesa: $('#numero-mesa').val(),
            pedido: $('#resumo').text()
        },
        success: function(resposta){
            Materialize.toast(resposta, 2000);

            $('#numero-mesa').val('');
            $('badge').remove();
        },
        failed: function(erro){
            Materialize.toast(erro.responseText, 3000, 'red-text');
        }
    });
});
//// index.html
.
.
.

<div id="confirmacao" class="modal modal-fixed-footer">
        <div class="modal-content">
            <h5>Resumo do pedido</h5>
            <input id="numero-mesa" type="number" class="validate" placeholder="Número da mesa">
            <blockquote id="resumo"></blockquote>
        </div>
        <div class="modal-footer">
            <button class="btn deep-orange waves-effect waves-light modal-close acao-finalizar">Pedir</button>
            <button class="btn-flat waves-effect waves-red modal-close">Cancelar</button>
        </div>
    </div>

<script src="cordova.js"></script>
    <script src="js/jquery.min.js"></script>
    <script src="js/materialize.min.js"></script>
    <script src="js/app.js"></script>

Me parece tudo certo.

Tente ver se tem algum erro quando está rodando no android.

Deixe seu celular plugado na USB e rode a aplicação usando o comando

cordova run android --device

Depois, com a aplicação aberta no celular e com o cabo USB, vá até o chrome e entre no endereço:

chrome://inspect/

Assim ele deve achar seu celular. Daí vá até a aba console e veja se tem algum erro quando vc faz a chamada para o servidor

Opa boa tarde,

É o Erro de CORS mesmo que está acontecendo, mas a declaração está correta no arquivo config.xml, tem ideia do que fazer?

GET http://cozinhapp.sergiolopes.org/novo-pedido?mesa=2&pedido=Brigadeiro%3A+4%2C+  jquery.min.js:4
k.cors.a.crossDomain.send jquery.min.js:4
n.extend.ajax jquery.min.js:4
(anonymous function) app.js:47
n.event.dispatch jquery.min.js:3
r.handle

Boa tarde,

Por desencargo de consciência baixei o projeto finalizado do curso, e mesmo compilando por ele, não consigo consumir o webservice pelo dispositivo real.

Agora já gastei todas as minhas fichas rsrsrs

Oi Ayrton,

Bem estranho dar erro de CORS. A ideia do whitelist era justo resolver isso :)

Bom, pode ser bug dessa ultima versao. Entao la vão alguns chutes pra gente tentar:

1) Muda o XML pra liberar geral: <access origin="*" />. Não costuma ser uma boa ideia, mas só pra gente ver se isso resolveria.

2) Tenta uma versão diferente do plugin. A propria 1.3.0 ou ate mesmo a 1.2.2. (remove o plugin antes com cordova plugin rm cordova-plugin-whitelist ai muda no XML a versao e instala de novo).

Boa tarde,

O origin=* já foi testado e não resolveu. Vou testar outra versão e posto o resultado.

Agredaço desde já.

Boa noite,

Fiz os testes sugeridos , com os seguintes passos na pasta do aplicativo:

1-)Removi o plugin com o comando passado acima:

cordova plugin rm cordova-plugin-whitelist

2-) Alterei o XML para acrescentar a versão especifica:

<plugin name="cordova-plugin-whitelist" spec="~1.2.2" />

3-) Baixei novamente o plugin com o comando:

cordova prepare

4-)Rodei novamente no device com o comando:

cordova run android --device

5-) Abri o inspect do chrome com: chrome://inspect/

E a resposta foi a seguinte, pelo device:

GET http://cozinhapp.sergiolopes.org/novo-pedido?mesa=2&pedido=Nutella%3A+1%2C+ net::ERR_NAME_NOT_RESOLVED

Pelo browser continua normal...

Caramba Ayrton, não faz sentido isso. Era pra funcionar!

Mais umas coisas:

1) No seu HTML, vc por acaso tem uma <meta> tag com Content-Security-Policy? Se tiver, ela pode estar interferindo nos requests.

2) Quer tentar a URL com HTTPS pra gente ver se funciona? https://cozinha.herokuapp.com/

Bom dia, Não tenho essa TAG com esse atributo, no cordova não existe uma configuração que possa travar isso ?

Não conheço nenhuma config desse tipo. Mas de qualquer forma parece que sua App não ta com nada de especial que possa estar bloqueando.

Realmente agora não sei o que fazer, estou com medo de acontecer o mesmo problema com a aplicação real que preciso começar a fazer utilizando IONIC, que vai consumir um webservice....

Estou realmente acreditando que é um problema com versão/configuração do cordova/nodeJs, então vou mandar as versões que estou utilizando apenas para ter mais informação, pra caso alguém ache algo pra me ajudar.

Versões{
    NodeJS: 6.9.2,
    Cordova: 6.4.0,
    Ionic: 2.1.17,
    cordova-plugin-whitelist: 1.2.2
}

Caso não obtenha solução até o inicio do próximo mês vou acabar optando pelo desenvolvimento Nativo mesmo =/...

Olá Pessoal bom dia,

Estou com um problema parecido, não consigo enviar a requisição Ajax pelo dispositivo, ao inspecionar o dispositivo no inspect do Chrome Developer Tools não está retornando erro algum, porém a requisição não está chegando ao servidor,

Atenciosamente,

Renan Lopes