Solucionado (ver solução)
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/

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software