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