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

Exception ao enviar informações

Quando clico no botão para enviar o json não recebo nenhum retorno e tenho o seguinte exception:

09-22 13:51:33.339 31175-31288/br.com.alura.agenda D/NetworkSecurityConfig: Using Network Security Config from resource network_security_config debugBuild: true
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err: java.io.FileNotFoundException: https://www.caelum.com.br/mobile
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:250)
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at br.com.alura.agenda.WebClient.post(WebClient.java:30)
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at br.com.alura.agenda.EnviaAlunosTask.doInBackground(EnviaAlunosTask.java:35)
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at br.com.alura.agenda.EnviaAlunosTask.doInBackground(EnviaAlunosTask.java:17)
09-22 13:51:33.925 31175-31288/br.com.alura.agenda W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:305)
09-22 13:51:33.926 31175-31288/br.com.alura.agenda W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-22 13:51:33.926 31175-31288/br.com.alura.agenda W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
09-22 13:51:33.926 31175-31288/br.com.alura.agenda W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
09-22 13:51:33.926 31175-31288/br.com.alura.agenda W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
09-22 13:51:33.927 31175-31288/br.com.alura.agenda W/System.err:     at java.lang.Thread.run(Thread.java:761)
09-22 13:51:33.982 31175-31208/br.com.alura.agenda D/EGL_emulation: eglMakeCurrent: 0x77f0737e6060: ver 2 0 (tinfo 0x77f0695eb0a0)
09-22 13:51:37.436 31175-31208/br.com.alura.agenda D/EGL_emulation: eglMakeCurrent: 0x77f0737e6060: ver 2 0 (tinfo 0x77f0695eb0a0)
5 respostas

Olá Regis,

Vamos precisar dar uma olhadinha no seu código pra gente conseguir descobrir o que tá acontecendo. Posta aqui os códigos das classes: WebClient e EnviaAlunosTask, por favor.

Classe WebClient

public class WebClient {

    public String post(String json) {
        try {
            URL url = new URL("https://www.caelum.com.br/mobile");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestProperty("Content-type", "application/json");
            connection.setRequestProperty("Accept", "application/json");
            connection.setDoOutput(true);

            PrintStream output = new PrintStream(connection.getOutputStream());
            output.println(json);

            connection.connect();

            Scanner scanner = new Scanner(connection.getInputStream());
            String resposta = scanner.next();

            return resposta;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

EnviaAlunosTask

public class EnviaAlunosTask extends AsyncTask<Object, Object, String> {

    private Context context;
    private ProgressDialog dialog;

    public EnviaAlunosTask(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(Object... params) {
        AlunoDAO dao = new AlunoDAO(context);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        AlunoConverter conversor = new AlunoConverter();
        String json = conversor.converterParaJSON(alunos);

        WebClient client = new WebClient();
        String resposta = client.post(json);

        return resposta;
    }

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(context, "Aguarde!", "Enviando alunos...", true, true);
    }

    @Override
    protected void onPostExecute(String o) {
        dialog.dismiss();
        Toast.makeText(context, o, Toast.LENGTH_LONG).show();
    }
}

Olá Regis,

Dei uma olhada nas suas classes e não encontrei nenhum erro aparente. Para ter certeza, copiei o seu código no meu projeto para esse curso e tudo funcionou. Isso significa que o problema está em outro ponto do código. Vou pedir para você postar aqui também o código da classe AlunoConverter. Se o JSON que estamos enviando não estiver com o formato esperado pelo nosso servidor, teremos exatamente essa Exception que está acontecendo.

Outra coisa que vai ajudar a gente a detectar o problema é printar o JSON que estamos enviando no log. Coloque a linha abaixo depois da linha que converte os alunos para JSON:

Log.i("ALUNOSJSON", json);

Rode novamente o aplicativo e peça para enviar os dados. Depois procure no console do Android o log que adicionamos com a tag ALUNOSJSON e poste aqui o JSON que vem logo em seguida. Dessa forma saberemos se o JSON está no formato correto.

Então pesquisando no google eu estava verificando esse link aqui: https://developer.android.com/training/articles/security-config.html?hl=pt-br mas mesmo seguindo os procedimentos não solucionou.

Obs. estou utilizando a api 25 (Android 7.1.1) no meu emulador.

I/ALUNOSJSON: {"List":[{"Aluno":[{"nome":"Jeferson Silva","nota":8},{"nome":"Daniel","nota":7},{"nome":"Ronaldo","nota":1},{"nome":"Felipe","nota":7}]}]}
package br.com.alura.agenda.converter;

import org.json.JSONException;
import org.json.JSONStringer;

import java.util.List;

import br.com.alura.agenda.modelo.Aluno;

/**
 * Created by Pessoal on 22/09/2017.
 */

public class AlunoConverter {

    public String converterParaJSON(List<Aluno> alunos) {
        JSONStringer js = new JSONStringer();

        try {
            js.object().key("List").array().object().key("Aluno").array();
            for (Aluno aluno : alunos) {
                js.object();
                js.key("nome").value(aluno.getNome());
                js.key("nota").value(aluno.getNota());
                js.endObject();
            }
            js.endArray().endObject().endArray().endObject();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return js.toString();
    }
}
solução!

Olhando novamente para o meu código consegui encontrar o erro na linha

js.object().key("List").array().object().key("Aluno").array();

a palavra list e aluno estão com a primeira letra em maiúsculo, alterando para todas letras em minusculo o código funcionou perfeitamente.