8
respostas

Servidor não recebe as informações JSON

Consigo realizar a conexão com o servidor local, porém quando é enviado um cadastro de aluno, no servidor é criado um cadastro em branco, sem nome, endereço, telefone, etc. Toda vez em que eu salvo ou altero um cadastro é criado um cadastro em branco no servidor web. Alguém pode me indicar oque poderia ser?

8 respostas

Oi Guilherme, tudo bem?

Pelo o que tudo indica um dos detalhes que pode estar acontendo é justamente a forma como está sendo feita serialização do aluno para objeto JSON. Considerando a aula que está é apresentada uma abordagem mais trabalhosa para enviarmos requisições para o servidor, na aula a seguir é abordada uma técnica mais sofisticada pra isso que é justamente com a biblioteca Retrofit, sugiro dar uma olhada nele, pois ele já realiza o processo de conversão de objeto para json e de json para objeto facilmente, ou seja, sem precisar configurar a serialização na mão...

De qualquer forma, se preferir, me manda o código que fez que eu dou uma olhada.

[]s

Segue abaixo os códigos:

package com.example.teammobile.exercicioagenda.web;

import android.support.annotation.Nullable;

import java.io.IOException;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

/**
 * Created by Felippe Neves on 28/08/2017.
 */

public class WebClient {

    public String post(String json){

        String endereco = "https://www.caelum.com.br/mobile";
        return realizaConexao(json, endereco);
    }

    public void insere(String js) {
        String endereco ="http://meuip:8080/aluno";
        realizaConexao(js, endereco);
    }

    @Nullable
    private String realizaConexao(String json, String endereco) {
        try {
            URL url = new URL(endereco);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestProperty("Content-type", "aplication/json");
            connection.setRequestProperty("Accept", "aplication/json");


            connection.setDoOutput(true);
            connection.setDoInput(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;
    }
}
package com.example.teammobile.exercicioagenda.tasks;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;

import com.example.teammobile.exercicioagenda.Modelo.Aluno;
import com.example.teammobile.exercicioagenda.web.WebClient;
import com.example.teammobile.exercicioagenda.converter.AlunoConverter;
import com.example.teammobile.exercicioagenda.dao.AlunoDAO;

import java.util.List;

/**
 * Created by Felippe Neves on 28/08/2017.
 */

public class EnviarAlunosTask extends AsyncTask<Void, Void, String> {

    private Context context;
    private ProgressDialog dialog;

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


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

    @Override
    protected String doInBackground(Void... objects) {
        WebClient client = new WebClient();
        AlunoDAO dao = new AlunoDAO(context);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        AlunoConverter converter = new AlunoConverter();
        String json = converter.converteParaJSON(alunos);


        String resposta = client.post(json);

        //Toast.makeText(context, resposta, Toast.LENGTH_SHORT).show();

        return resposta;
    }

    @Override
    protected void onPostExecute(String resposta) {
        dialog.dismiss();
        Toast.makeText(context, resposta, Toast.LENGTH_LONG).show();
    }
}
new InsereAlunoTask(aluno).execute();

Oi Guilherme, pode mandar o código do AlunoConverter? Pois é nele que está acontecendo a conversão.

[]s

package com.example.teammobile.agenda.converter;

import com.example.teammobile.agenda.modelo.Aluno;

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

import java.util.List;

/**
 * Created by Felippe Neves on 28/08/2017.
 */

public class AlunoConverter {


    public String converteParaJSON(List<Aluno> alunos) {

        //classe para montar JSON
        JSONStringer js = new JSONStringer();


        try {
            //cabecalho
            //esses comandos são especificos para concatenar e transformar em uma string JSON,
            //{ "list": [ { "aluno": [
            js.object().key("list").array().object().key("aluno").array();

            //pegar todos os alunos do banco
            for(Aluno aluno : alunos){
                //abre {
                js.object();
                //chave e valor
                js.key("nome").value(aluno.getNome());
                js.key("nota").value(aluno.getNota());

                //fecha }
                js.endObject();
            }
            //fechar o cabeçalho
            //] } ] }
            js.endArray().endObject().endArray().endObject();

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return js.toString();
    }

    public String converteParaJSONCompleto(Aluno aluno) {
        JSONStringer js = new JSONStringer();

        try {
            js.object()
                    .key("nome").value(aluno.getNome())
                    .key("endereco").value(aluno.getEndereco())
                    .key("site").value(aluno.getSite())
                    .key("telefone").value(aluno.getTelefone())
                    .key("nota").value(aluno.getNota())
            .endObject();

            return js.toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }
}

Oi Guilherme, tudo indica que você está usando o conversor que não manda todas as informações do aluno para o servidor, ou seja, você tá usando a converteParaJSON sendo que precisa usar a converteParaJSONCompleto.

Modifica a chamanda dentro do doInBackground dentro da AsyncTask e veja se funciona.

[]s

Desculpas enviei a classe errada. Segue abaixo a classe correta:

package com.example.teammobile.agenda.tasks;

import android.os.AsyncTask;

import com.example.teammobile.agenda.converter.AlunoConverter;
import com.example.teammobile.agenda.modelo.Aluno;
import com.example.teammobile.agenda.web.WebClient;



public class InsereAlunoTask extends AsyncTask{

    //não queremos modificar esse objeto, por isso o final
    private Aluno aluno;

    public InsereAlunoTask(Aluno aluno) {
        this.aluno = aluno;
    }


    //
    @Override
    protected Object doInBackground(Object[] objects) {

        String json = new AlunoConverter().converteParaJSONCompleto(aluno);
        new WebClient().insere(json);
        return null;
    }
}

Note que ela já esta com o converteParaJSONCompleto. Com a biblioteca Retrofit eu consegui, porém na primeira vez em que fui compilar deu um erro dizendo que estourei a quantidade de métodos. Ao inserir esse código: multiDexEnabled true no build.gradle funcionou.

Queria saber porque fazendo sem a biblioteca, seguindo todos os passos, realizando de fato a conexao, nao aparece os dados do aluno no servidor web, so aparece um cadastro com campos vazio ?

Opa Guilherme, blz?

Não tinha reparado direito, mas agora que vi, veja como está a url que está enviando o aluno para o server:

    public void insere(String js) {
        String endereco ="http://meuip:8080/aluno";
        realizaConexao(js, endereco);
    }

No caso precisamos usar o endereço "http://meuip:8080/api/aluno", pois no endereço que mandou, é o mesmo que é usado na aplicação web, ou seja, ele cria um aluno vazio mesmo.

Isso acontece, pois não existe nenhum mecanismo de verificação que impede a criação de um aluno sem nenhuma informação.

Basta mudar o endereço para "/api/aluno" que vai dar certo.

[]s

Opa beleza. Então eu precisei fazer essa alteração, pois com o /api/aluno eu não estava conseguindo realizar a conexão com o servidor, somente com o /aluno que eu consegui realizar a conexão.