Solucionado (ver solução)

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!

Solucionado
(ver solução)
12
respostas

Projeto sem biblioteca APACHE - WebCliente

Olá...

Estou com um probleminha simples que é justamente na hora de implementar a classe webclient como pedido na aula.

Quando fui usar o HttpPost o meu android Studio não encontrou a lib.

Como faço para colocar no projeto, se é que está faltando, usando o android Studio? Ainda não estou bem adptado a essa nova interface de IDE.

12 respostas

Bom dia Flavio, como está ?

O pessoal do google, recentemente deixou essa biblioteca como depreciada, mas deixaram uma classe disponível que tem a mesma função :

HttpURLConnection

Se você quiser conhece-la pode entrar no site do desenvolvedor android : http://developer.android.com/reference/java/net/HttpURLConnection.html

Contudo você ainda pode trabalhar com a biblioteca do curso de maneira bem simples, no seu gradle, um arquivo que temos no projeto, você apenas vai pedir para ele compilar uma biblioteca, desta forma :

android {
    useLibrary 'org.apache.http.legacy'
}

Com isso você tem acesso a biblioteca que estamos usando no curso !

Espero ter ajudado :)

Abraços

Matheus

Opa Matheus vlw a resposta, mas ainda estou sem saber implementar o metodo que seja similar ao do video. Eu fiz isso mas não sei se está correto, voce poderia me dizer se é isso mesmo?


public String post(String json) {
        try {
            URL urlAcesso = new URL(url);
            HttpURLConnection urlConnection = (HttpURLConnection) urlAcesso.openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setChunkedStreamingMode(0);
            urlConnection.setRequestProperty("Content-type", "application/json");
            urlConnection.setRequestProperty("Accept", "application/json");
            urlConnection.setRequestMethod("POST");

            OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
            //writeStream(out);????????
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            //readStream(in);?????????
            return readStream(in);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private String readStream(InputStream is) {
        try {
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            int i = is.read();
            while(i != -1) {
                bo.write(i);
                i = is.read();
            }
            return bo.toString();
        } catch (IOException e) {
            return "";
        }
    }

Eu gostaria de dizer tambem que não consegui importar biblioteca antiga. No projeto tem dois gradle: build.gradle(Project: CadastroTeste) build.gradle(Module: app)


public String post(String json) {
        try {
            URL urlAcesso = new URL(url);
            HttpURLConnection urlConnection = (HttpURLConnection) urlAcesso.openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setChunkedStreamingMode(0);
            urlConnection.setRequestProperty("Content-type", "application/json");
            urlConnection.setRequestProperty("Accept", "application/json");
            urlConnection.setRequestMethod("POST");

            OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
            //writeStream(out);????????
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            //readStream(in);?????????
            return readStream(in);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private String readStream(InputStream is) {
        try {
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            int i = is.read();
            while(i != -1) {
                bo.write(i);
                i = is.read();
            }
            return bo.toString();
        } catch (IOException e) {
            return "";
        }
    }

Ola Flavio,

Não cheguei a testar a forma que você fez, vou te mostrar a forma que eu fiz que está rodando e executando da mesma forma que a biblioteca da Apache.

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

            connection.setRequestMethod("POST");

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

            connection.setDoOutput(true);

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

            connection.connect();

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

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

        return null;
    }

Espero ter ajudado !

Abraço

Matheus :)

Opa Matheus, boa noite! Ajudou sim cara... mas agora surgiu o seguinte erro que eu não estou entendendo o pq.

Foi na linha de codigo:

String resposta = new Scanner(urlConnection.getInputStream()).next();

A saida do erro é essa:


10-06 22:09:56.870  31368-31746/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.example.flviomonteiro.cadastroteste, PID: 31368
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.util.NoSuchElementException
            at java.util.Scanner.next(Scanner.java:961)
            at java.util.Scanner.next(Scanner.java:934)
            at com.example.flaviomonteiro.support.WebClient.post(WebClient.java:42)
            at com.example.flaviomonteiro.task.EnviaContatosTask.doInBackground(EnviaContatosTask.java:41)
            at com.example.flaviomonteiro.task.EnviaContatosTask.doInBackground(EnviaContatosTask.java:20)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
10-06 22:09:57.661  31368-31368/? D/AbsListView﹕ onDetachedFromWindow
10-06 22:09:57.701  31368-31368/? E/WindowManager﹕ android.view.WindowLeaked: Activity com.example.flviomonteiro.cadastroteste.ListaPessoasActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{427dd368 V.E..... R......D 0,0-513,243} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:463)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:267)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:301)
            at android.app.ProgressDialog.show(ProgressDialog.java:117)
            at android.app.ProgressDialog.show(ProgressDialog.java:100)
            at android.app.ProgressDialog.show(ProgressDialog.java:95)
            at com.example.flaviomonteiro.task.EnviaContatosTask.onPreExecute(EnviaContatosTask.java:32)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
            at android.os.AsyncTask.execute(AsyncTask.java:535)
            at com.example.flviomonteiro.cadastroteste.ListaPessoasActivity.onOptionsItemSelected(ListaPessoasActivity.java:78)
            at android.app.Activity.onMenuItemSelected(Activity.java:2708)
            at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:325)
            at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147)
            at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
            at android.support.v7.app.AppCompatDelegateImplV7.onMenuItemSelected(AppCompatDelegateImplV7.java:609)
            at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
            at android.support.v7.internal.view.menu.SubMenuBuilder.dispatchMenuItemSelected(SubMenuBuilder.java:84)
            at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
            at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
            at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948)
            at android.support.v7.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:191)
            at android.widget.AdapterView.performItemClick(AdapterView.java:308)
            at android.widget.AbsListView.performItemClick(AbsListView.java:1510)
            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3472)
            at android.widget.AbsListView$3.run(AbsListView.java:4835)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5593)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
            at dalvik.system.NativeStart.main(Native Method)

Tem ideia de que erro pode ser esse? A implementação do metodo usei o mesmo que o seu.

Fábio, estou tentando reproduzir o erro aqui e não estou conseguindo!

Pode enviar para gente ver o código da sua AsyncTask e o seu WebClient por gentileza.

Sim claro...

Aqui o AsyncTask:

package com.example.flaviomonteiro.task;

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

import com.example.flaviomonteiro.converter.PessoaConverter;
import com.example.flaviomonteiro.entity.Pessoa;
import com.example.flaviomonteiro.persistente.DBHelper;
import com.example.flaviomonteiro.persistente.PessoaDAO;
import com.example.flaviomonteiro.support.WebClient;

import java.util.List;
import java.util.Objects;

/**
 * Created by FlávioMonteiro on 06/10/2015.
 */
public class EnviaContatosTask extends AsyncTask<Object, Object, String> {

    private Context ctx;
    private ProgressDialog progress;


    public EnviaContatosTask(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    protected void onPreExecute() {
        progress = ProgressDialog.show(ctx, "Aguarde", "Enviando dados para o servidor");
    }

    @Override
    protected String doInBackground(Object... params) {
        DBHelper dbHelper = new DBHelper(ctx);
        PessoaDAO pessoaDAO = new PessoaDAO(dbHelper);
        List<Pessoa> pessoasList = pessoaDAO.getListaPessoas();
        String json = new PessoaConverter().toJSON(pessoasList);
        String media = new WebClient("http://www.caelum.com.br/mobile").post(json);
        return media;
    }

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

E o WebClient:


package com.example.flaviomonteiro.support;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

/**
 * Created by FlávioMonteiro on 04/10/2015.
 */
public class WebClient {

    private String url;

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

    public String post(String json) {
        try {
            json = json.replaceFirst("pessoa", "aluno");
            URL urlAcesso = new URL(url);
            HttpURLConnection urlConnection = (HttpURLConnection) urlAcesso.openConnection();
            urlConnection.setDoOutput(true);
            //urlConnection.setChunkedStreamingMode(0);
            urlConnection.setRequestProperty("Content-type", "application/json");
            urlConnection.setRequestProperty("Accept", "application/json");
            urlConnection.setRequestMethod("POST");

            //OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
            PrintStream saida = new PrintStream(urlConnection.getOutputStream());
            saida.println(json);
            urlConnection.connect();
            //writeStream(out);????????
            //InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            String resposta = readStream(urlConnection.getInputStream());
            //readStream(in);?????????
            return resposta;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    private String readStream(InputStream is) {
        try {
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            int i = is.read();
            while(i != -1) {
                bo.write(i);
                i = is.read();
            }
            return bo.toString();
        } catch (IOException e) {
            return "";
        }
    }
}

Mandei uma linha errada de codigo... desconsiderar por favor! kkkk...

Essa daq: Pode retirar, foi um teste que tava fazendo.

json = json.replaceFirst("pessoa", "aluno");

Outro detalhe... troca a linha de codigo do meu metodo que eh chamado:

String resposta = readStream(urlConnection.getInputStream());

Por essa q vc usa, deve ser isso que nao saiu o erro! Pq no metodo que criei readStream la ele ta tratado caso n venha nd no InputStream.

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

Flavio bom dia,

O erro persiste ? Fiz alguns testes aqui, e mesmo se o retorno for vazio, o seu Toast seria criado, entretanto não mostrando nada !

Vi ali no erro que ele volta duas linhas dentro da sua AsyncTask, a linha 20 e a 41, você falar quais são esses erros ?

Vou colocar aqui o código junto dos imports dessas minhas classes, tenta fazer o teste ai e vemos o que acontece !


package br.com.caelum.fj57design.servidor;

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

/**
 * Created by matheus on 10/09/15.
 */
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.setRequestMethod("POST");


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

            connection.setDoOutput(true);

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

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


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

        return null;
    }
}

E agora :


package br.com.caelum.fj57design.asynctask;

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

import java.util.List;

import br.com.caelum.fj57design.Dao.AlunoDao;
import br.com.caelum.fj57design.converter.AlunoConverter;
import br.com.caelum.fj57design.modelo.Aluno;
import br.com.caelum.fj57design.servidor.WebClient;

/**
 * Created by matheus on 10/09/15.
 */
public class EnviaDadosServidor extends AsyncTask<String, Void, String> {


    private Context context;
    private ProgressDialog progressDialog;

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

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        progressDialog = ProgressDialog.show(context, "Aguarde ...", "Enviando dados para o servidor", false, false);

    }

    @Override
    protected void onPostExecute(String media) {
        super.onPostExecute(media);

        progressDialog.dismiss();
        Toast.makeText(context, media, Toast.LENGTH_LONG).show();
    }

    @Override
    protected String doInBackground(String... params) {

        AlunoDao dao = new AlunoDao(context);
        List<Aluno> alunos = dao.pegaAlunos();
        dao.close();

        AlunoConverter converter = new AlunoConverter();

        String json = converter.toJson(alunos);

        WebClient webClient = new WebClient();

        String resposta = webClient.post(json);


        return resposta;
    }
}
solução!

Flavio !

Vi aqui que o erro é na url, você tem que colocar https invés de http, depois que fizer essa alteração está tudo ok :p

Abraços :)

Matheus

Blz... irei tentar Matheus... so estou demorando pq agora meu aparelho ta demorando a conectar e qndo aparece surge mensagem de "dispositivo usb nao reconhecido" -.-'''''' Do nada isso começa! Q raiva... Mas vlw a ajuda msm... o/