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

Erro 500 no retorno da média das notas

Tenho o código conforme video, porém o retorno é ERRO 500 DO SITE: http://caelum.com.br/mobile

Abaixo meu código!

case R.id.enviar_alunos:

            Thread tarefaPesada = new Thread(){

                @Override
                public void run() {
                    String urlServer =  "http://caelum.com.br/mobile";

                    AlunoDAO dao = new AlunoDAO(ListaAlunos.this);
                    List<Aluno> alunos = dao.getLista();
                    dao.close();

                    String dadosJSON = new AlunoConverter().toJSON(alunos);

                    WebClient client = new WebClient(urlServer);    
                    String respostaJSON = client.post(dadosJSON);

                    //Toast.makeText(ListaAlunos.this, respostaJSON, Toast.LENGTH_LONG).show();
                    Log.i("Retorno da Chamada: ", respostaJSON);
                }                

            };

            tarefaPesada.start();
4 respostas

Cara pra te ajudar em algo vou colocar o meu codigo aqui. ListaAlunosActivity:

public class ListaAlunosActivity extends ActionBarActivity {

    private ListView listaAlunos;
    private Aluno alunoSelecionado;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listagem_alunos);

        listaAlunos = (ListView) findViewById(R.id.lista_alunos);
        registerForContextMenu(listaAlunos);

        listaAlunos.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view,
                                    int posicao, long id) {
                Aluno altAluno = (Aluno) adapter.getItemAtPosition(posicao);
                Intent irParaFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                irParaFormulario.putExtra("alunoAlteracao", altAluno);
                startActivity(irParaFormulario);
            }

        });

        listaAlunos.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> adapter, View view,
                                           int posicao, long id) {

                alunoSelecionado = (Aluno) adapter.getItemAtPosition(posicao);

                return false;
            }
        });
    }

    @Override
    protected void onResume() {

        super.onResume();

        carregaLista();
    }

    private void carregaLista() {
        AlunoDAO dao = new AlunoDAO(this);
        List<Aluno> alunos = dao.getLista();
        dao.close();


        ListaAlunosAdapter adapter = new ListaAlunosAdapter(alunos, this);

        LayoutInflater inflater = getLayoutInflater();

        listaAlunos.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_principal, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemClicado = item.getItemId();

        switch (itemClicado) {

            case R.id.menu_novo:
                Intent irParaFormulario = new Intent(this, FormularioActivity.class);
                startActivity(irParaFormulario);
                break;

            case R.id.mapa:
                Intent irParaMapa = new Intent(this, MostraAlunosProximos.class);
                startActivity(irParaMapa);
                break;

            case R.id.menu_receber_provas:
                Intent provas = new Intent(this, ProvasActivity.class);
                startActivity(provas);
                return false;
//aqui pra chamar a classe que tem os metodos pra fazer a media em segundo plano
            case R.id.menu_enviar_alunos:
                EnviaAlunosTask task = new EnviaAlunosTask(this);
                task.execute();

            default:
                return super.onOptionsItemSelected(item);
        }
        return false;

    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenuInfo menuInfo) {

        MenuItem ligar = menu.add("Ligar");
        ligar.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent irParaTelaDeDiscagem = new Intent(Intent.ACTION_CALL);
                Uri discarPara = Uri.parse("tel:" + alunoSelecionado.getTelefone());
                irParaTelaDeDiscagem.setData(discarPara);
                startActivity(irParaTelaDeDiscagem);
                return false;
            }
        });

        MenuItem sms = menu.add("Enviar SMS");
        Intent intentSms = new Intent(Intent.ACTION_VIEW);
        intentSms.setData(Uri.parse("sms" + alunoSelecionado.getTelefone()));
        intentSms.putExtra("sms_body", "Mensagem");
        sms.setIntent(intentSms);

        MenuItem site = menu.add("Navegar no site");
        site.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent irParaOSite = new Intent(Intent.ACTION_VIEW);
                Uri localSite = Uri.parse("http://" + alunoSelecionado.getSite());
                irParaOSite.setData(localSite);
                startActivity(irParaOSite);
                return false;
            }
        });

        MenuItem deletar = menu.add("Deletar");
        deletar.setOnMenuItemClickListener(new OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                AlunoDAO dao = new AlunoDAO(ListaAlunosActivity.this);
                dao.deletar(alunoSelecionado);
                dao.close();
                carregaLista();
                return false;
            }
        });

        menu.add("Ver no mapa");
        menu.add("Enviar e-mail");

        super.onCreateContextMenu(menu, v, menuInfo);
    }

}

EnviaAlunosTask

/*Thread para fazer a sincronizaçao em segundo plano.
assim o celular nao fica travado*/
public class EnviaAlunosTask extends AsyncTask<Integer, Double, String> {
    //context usado para criar o DAO
    private final Activity context;
    private ProgressDialog progress;

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

    @Override
    protected void onPreExecute() {
        progress = ProgressDialog.show(context, "Aguarde...", "Enviando dados para web...", true, true);
    }

    @Override
    protected String doInBackground(Integer... params) {
        String urlServer = "http://www.caelum.com.br/mobile";

        AlunoDAO dao = new AlunoDAO(context);
        List<Aluno> alunos = dao.getLista();
        dao.close();

        String dadosJSON = new AlunoConverter().toJSON(alunos);

        WebClient client = new WebClient(urlServer);

        final String respostaJSON = client.post(dadosJSON);
        return respostaJSON;
    }

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

}

AlunoConverter

public class AlunoConverter {

    public String toJSON(List<Aluno> alunos) {
        try {

            JSONStringer js = new JSONStringer();
            js.object().key("list").array();
            js.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();
            js.endArray().endObject();

            return js.toString();
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

    }

}

WebClient

public class WebClient {

    private String urlServer;

    public WebClient(String urlServer) {
        this.urlServer = urlServer;
    }

    public String post(String dadosJSON) {
        try {

            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(urlServer);

            post.setEntity(new StringEntity(dadosJSON));
            post.setHeader("Content-type", "application/json");
            post.setHeader("Accept", "application/json");

            HttpResponse response = client.execute(post);
            HttpEntity resposta = response.getEntity();

            String respostaEmJSON = EntityUtils.toString(resposta);

            return respostaEmJSON;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Lembro que quando eu fiz deu um erro na tela do emulador mesmo. Apareceu um e um monte de código html. Então esperei um pouco e tentei novamente. E retornou a media sem problemas. Então o problema para mim foi na minha conexão ou no servidor deles. Mas de qualquer forma coloquei ai o meu código, assim você poderá comparar com o seu.

Infelizmente é um erro do site. Não tem o que fazer.

solução!

Normalmente quando você faz uma requisição HTTP ela retorna um código dizendo o que ocorreu, por exemplo 200 diz que está tudo ok, e nesse caso 500 o problema é do lado do servidor. Tem um site http://www.macoratti.net/http_err.htm que mostra os código, dê uma olhada.

Pessoal,

não podemos esquecer de colocar a URL completa (incluíndo o www.).

Caso esqueçamos do www. ou tentemos acessar a URL via GET ou enviemos um JSON num formato diferente, tomaremos esse erro 500. Caso não coloquemos o http://, veremos um IllegalStateException do DefaultHttpClient. Ambos os problemas podem nos induzir a achar que o bug está no servidor, mas na realidade está do lado do Android.

Abraços!