Portal Android - Comunidade de Desenvolvedores Android
http://www.portalandroid.org/comunidade/

[Artigo] Web Service RESTful 2 [+Consumir+Android+Code]
http://www.portalandroid.org/comunidade/viewtopic.php?f=119&t=17465
Página 6 de 6

Autor:  SilvioLima [ 04 Mai 2014, 22:46 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Ola pessoal,

Onde o esta o projeto com código completo para consumir dados no android ?
Implementei no meu PC o webservice referente ao banco cliente. Ok.
Agora estou tentando implementar no notebook para simular um acesso remoto e acessar os dados no servidor.

Quando ele fala de criar um projeto ExConsumirWS, fiquei na dúvida se era um Projeto Java ou Android Application Project.

Poderia me ajudar, por favor.

Obrigado,

Silvio

Autor:  SilvioLima [ 04 Mai 2014, 22:53 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Por favor desconsidere minha pergunta anterior.

Já encontrei o projeto ExConsumirWS anexo.

Obrigado

Silvio

Autor:  SilvioLima [ 06 Mai 2014, 00:23 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Ola,

O WebService esta ok em parte.
Estou usando o código do primeiro webservice onde existe apenas o resource listarTodos.

No browser : http://192.168.0.100:8088/Restful/cliente/listarTodos
{"cliente":[{"cpf":"00314","endereco":"Rua 2","id":"8","nome":"zaza"},{"cpf":"00212","endereco":"Rua 1","id":"2","nome":"zeze"},{"cpf":"00314","endereco":"Rua 2","id":"7","nome":"zizi"},{"cpf":"00414","endereco":"Rua 3","id":"5","nome":"zozo"},{"cpf":"00515","endereco":"Rua 4","id":"6","nome":"zuzu"}]}

Porém no cliente android, ao clicar no botão Buscar Todos:
Mensagem: This is not a Json Array

Realmente a saída não é um array faltam os [ ].

Pode ser algo simples, mas não consegui resolver isso.
Poderia me ajudar, por favor ?

Silvio

Autor:  antunes [ 06 Mai 2014, 13:30 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

SilvioLima escreveu:
Ola,

O WebService esta ok em parte.
Estou usando o código do primeiro webservice onde existe apenas o resource listarTodos.

No browser : http://192.168.0.100:8088/Restful/cliente/listarTodos
{"cliente":[{"cpf":"00314","endereco":"Rua 2","id":"8","nome":"zaza"},{"cpf":"00212","endereco":"Rua 1","id":"2","nome":"zeze"},{"cpf":"00314","endereco":"Rua 2","id":"7","nome":"zizi"},{"cpf":"00414","endereco":"Rua 3","id":"5","nome":"zozo"},{"cpf":"00515","endereco":"Rua 4","id":"6","nome":"zuzu"}]}

Porém no cliente android, ao clicar no botão Buscar Todos:
Mensagem: This is not a Json Array

Realmente a saída não é um array faltam os [ ].

Pode ser algo simples, mas não consegui resolver isso.
Poderia me ajudar, por favor ?

Silvio


Você chegou a mudar alguma coisa no projeto?

Abraços!

Autor:  SilvioLima [ 15 Mai 2014, 18:25 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Ola,

Meu WS Restful esta ok, pequenos detalhes para ficar perfeito. Agradeço pelos tutorais e pela disponibilidade em ajudar de todos.
Deste WS eu trago uma lista com vários itens e suas respectivas informações, são ao todos 300 itens.
Queria no cliente apresentar apenas o campo nome de cada item.
Ao selecionar o item, eu apresentaria as demais informações.

Eu pensei em fazer uma busca no WS por id trazendo apenas o campo nome.
Mas isso significaria que depois eu teria que fazer uma nova busca no WS pelos demais dados do item selecionado.

Imagino que isso seria uma carga para a rede. Correto ?

Tem como filtrar a informação que desejo mostrar na listview ?

Obrigado,

Silvio

Autor:  jean santiago [ 31 Mai 2014, 06:13 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

antunes,

Não consegui implementar a asynctask para usar em versões maiores que a API 8.
Dá uma luz aí! /uu

Autor:  jean santiago [ 31 Mai 2014, 20:19 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Minha Activity com asyncTask ficou assim (apenas o método buscarTodos):

public class ExConsumirWSActivity extends Activity {

    private ProgressDialog pDialog;

    private String id;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final EditText idEdt = (EditText) findViewById(R.id.editTextIdCliente);
        final TextView txtView = (TextView) findViewById(R.id.textView1);
        Button buscarIdBtn = (Button) findViewById(R.id.buttonBuscarPorId);
        Button buscarTodosBtn = (Button) findViewById(R.id.buttonBuscarTodos);
        Button deletarBtn = (Button) findViewById(R.id.buttonDeletarCliente);
        Button inserirBtn = (Button) findViewById(R.id.buttonInserirCliente);

        buscarTodosBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new GetAllClientes().execute();
            }
        });
    }

    private class GetAllClientes extends AsyncTask<Void, Void, Void> {
        ArrayList<Cliente> listaCliente;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(ExConsumirWSActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            ClienteREST cliREST = new ClienteREST();
            try {
                listaCliente = (ArrayList<Cliente>) cliREST.getListaCliente();
            } catch (Exception e) {
                e.printStackTrace();
                gerarToast(e.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            Intent i = new Intent(getApplicationContext(), ListaClientes.class);
            i.putExtra("lista", listaCliente);
            startActivity(i);
        }
    }
}


Num AVD com API 8 funcionou tranquilo, numa maior não funciona.

O logCat apresenta isso:

05-31 21:18:10.118: E/AndroidRuntime(1989): FATAL EXCEPTION: AsyncTask #1
05-31 21:18:10.118: E/AndroidRuntime(1989): Process: com.santiago.testews, PID: 1989
05-31 21:18:10.118: E/AndroidRuntime(1989): java.lang.RuntimeException: An error occured while executing doInBackground()
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.os.AsyncTask$3.done(AsyncTask.java:300)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.lang.Thread.run(Thread.java:841)
05-31 21:18:10.118: E/AndroidRuntime(1989): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.os.Handler.<init>(Handler.java:200)
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.os.Handler.<init>(Handler.java:114)
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.widget.Toast$TN.<init>(Toast.java:327)
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.widget.Toast.<init>(Toast.java:92)
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.widget.Toast.makeText(Toast.java:241)
05-31 21:18:10.118: E/AndroidRuntime(1989): at com.santiago.views.ExConsumirWSActivity.gerarToast(ExConsumirWSActivity.java:154)
05-31 21:18:10.118: E/AndroidRuntime(1989): at com.santiago.views.ExConsumirWSActivity.access$2(ExConsumirWSActivity.java:151)
05-31 21:18:10.118: E/AndroidRuntime(1989): at com.santiago.views.ExConsumirWSActivity$GetAllClientes.doInBackground(ExConsumirWSActivity.java:134)
05-31 21:18:10.118: E/AndroidRuntime(1989): at com.santiago.views.ExConsumirWSActivity$GetAllClientes.doInBackground(ExConsumirWSActivity.java:1)
05-31 21:18:10.118: E/AndroidRuntime(1989): at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-31 21:18:10.118: E/AndroidRuntime(1989): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-31 21:18:10.118: E/AndroidRuntime(1989): ... 4 more

Autor:  raphaelframos [ 01 Jun 2014, 13:30 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Jean, o problema é que você está mostrando um Toast no doInBackground, nesse método você não pode ter contato nenhum com sua thread principal. Seu banco deve estar em branco, ae cai no exception que mostra esse Toast. Tira ele dali que vai funcionar. Vlw!

Autor:  Fabio Caravalho [ 15 Jul 2014, 18:26 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Cara..... nao sei se alguem ainda ver esse post, mais eu copiei o codigo igual no entanto sempre da a messagem Falha na conexão, ja tentei usar o ip local e nada....

Autor:  antunes [ 18 Jul 2014, 17:51 ]
Assunto do Tópico:  Re: Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Co

Fabio Caravalho escreveu:
Cara..... nao sei se alguem ainda ver esse post, mais eu copiei o codigo igual no entanto sempre da a messagem Falha na conexão, ja tentei usar o ip local e nada....

Explica melhor o seu problema. Coloque também a configuração do seu projeto, parte do código e etc.

Abraços!

Autor:  noxzenho [ 04 Ago 2014, 18:21 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Antunes, parabéns pelo post!!
Grande contribuição!

Mas peguei o projeto e modifiquei para uma consulta apenas no meu banco de dados.
Quando faço o teste do WS pelo browser é retornado o JSON corretamente.
Porém ao executar no emulador me retorna o erro HTTP 405.
Estive pesquisando sobre esse erro aqui no fórum, mas só encontrei um tópico de um cara falando que no problema dele, teve a ver com a versão do android que ele estava emulando.
Você sabe se isso procede?

Autor:  noxzenho [ 05 Ago 2014, 10:55 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Antunes, problema resolvido.
Estava passando uma string como parâmetro na minha URL.
Porém essa string estava estourando o limite de caracteres no meu WS.

Autor:  silviobarretto [ 03 Set 2014, 14:56 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Olá Antunes,
Criei o projeto com algumas alterações para adaptar ao meu projeto, estou usando um banco msyql. O meu webservice, está funcionando perfeitamente, retornando o json o banco. Mas qdo vou rodar pelo emulador dá erro "Falha na rede" e falha ao acessar o web service como abaixo:

09-03 15:47:12.921:
E/NGVL(658): Falha ao acessar Web service
09-03 15:47:12.921:
E/NGVL(658): android.os.NetworkOnMainThreadException
09-03 15:47:12.921:
E/NGVL(658): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
09-03 15:47:12.921:
E/NGVL(658): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
09-03 15:47:12.921:
E/NGVL(658): at libcore.io.IoBridge.connectErrno(IoBridge.java:144)
09-03 15:47:12.921:
E/NGVL(658): at libcore.io.IoBridge.connect(IoBridge.java:112)
09-03 15:47:12.921:
E/NGVL(658): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-03 15:47:12.921:
E/NGVL(658): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
09-03 15:47:12.921:
E/NGVL(658): at java.net.Socket.connect(Socket.java:842)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
09-03 15:47:12.921:
E/NGVL(658): at br.com.cactus.webservice.WebServiceCliente.get(WebServiceCliente.java:25)
09-03 15:47:12.921:
E/NGVL(658): at br.com.cactus.webservice.ClienteREST.getListaDealer(ClienteREST.java:31)
09-03 15:47:12.921:
E/NGVL(658): at br.com.cactus.app.Admin$2.onClick(Admin.java:61)
09-03 15:47:12.921:
E/NGVL(658): at android.view.View.performClick(View.java:4084)
09-03 15:47:12.921:
E/NGVL(658): at android.view.View$PerformClick.run(View.java:16966)
09-03 15:47:12.921:
E/NGVL(658): at android.os.Handler.handleCallback(Handler.java:615)
09-03 15:47:12.921:
E/NGVL(658): at android.os.Handler.dispatchMessage(Handler.java:92)
09-03 15:47:12.921:
E/NGVL(658): at android.os.Looper.loop(Looper.java:137)
09-03 15:47:12.921:
E/NGVL(658): at android.app.ActivityThread.main(ActivityThread.java:4745)
09-03 15:47:12.921:
E/NGVL(658): at java.lang.reflect.Method.invokeNative(Native Method)
09-03 15:47:12.921:
E/NGVL(658): at java.lang.reflect.Method.invoke(Method.java:511)
09-03 15:47:12.921:
E/NGVL(658): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-03 15:47:12.921:
E/NGVL(658): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-03 15:47:12.921:
E/NGVL(658): at dalvik.system.NativeStart.main(Native Method)


MEU CÓDIGO:
WebServiceCliente
package br.com.cactus.webservice;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;

import android.util.Log;

public class WebServiceCliente {

public final String[] get(String url) {

String[] result = new String[2];
HttpGet httpget = new HttpGet(url);
HttpResponse response;

try {
response = HttpClientSingleton.getHttpClientInstace().execute(httpget);
HttpEntity entity = response.getEntity();

if (entity != null) {
result[0] = String.valueOf(response.getStatusLine().getStatusCode());
InputStream instream = entity.getContent();
result[1] = toString(instream);
instream.close();
Log.i("get", "Result from post JsonPost : " + result[0] + " : " + result[1]);
}
} catch (Exception e) {
Log.e("NGVL", "Falha ao acessar Web service", e);
result[0] = "0";
result[1] = "Falha de rede!";
}
return result;
}

public final String[] post(String url, String json) {
String[] result = new String[2];
try {

HttpPost httpPost = new HttpPost(new URI(url));
httpPost.setHeader("Content-type", "application/json");
StringEntity sEntity = new StringEntity(json, "UTF-8");
httpPost.setEntity(sEntity);

HttpResponse response;
response = HttpClientSingleton.getHttpClientInstace().execute(httpPost);
HttpEntity entity = response.getEntity();

if (entity != null) {
result[0] = String.valueOf(response.getStatusLine().getStatusCode());
InputStream instream = entity.getContent();
result[1] = toString(instream);
instream.close();
Log.d("post", "Result from post JsonPost : " + result[0] + " : " + result[1]);
}

} catch (Exception e) {
Log.e("NGVL", "Falha ao acessar Web service", e);
result[0] = "0";
result[1] = "Falha de rede!";
}
return result;
}

private String toString(InputStream is) throws IOException {

byte[] bytes = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int lidos;
while ((lidos = is.read(bytes)) > 0) {
baos.write(bytes, 0, lidos);
}
return new String(baos.toByteArray());
}
}


HttpClientSingleton
package br.com.cactus.webservice;

import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

public class HttpClientSingleton {

private static final int JSON_CONNECTION_TIMEOUT = 3000;
private static final int JSON_SOCKET_TIMEOUT = 5000;
private static HttpClientSingleton instance;
private HttpParams httpParameters;
private DefaultHttpClient httpclient;

private void setTimeOut(HttpParams params) {
HttpConnectionParams.setConnectionTimeout(params,
JSON_CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, JSON_SOCKET_TIMEOUT);
}

private HttpClientSingleton() {
httpParameters = new BasicHttpParams();
setTimeOut(httpParameters);
httpclient = new DefaultHttpClient(httpParameters);
}

public static DefaultHttpClient getHttpClientInstace() {
if (instance == null)
instance = new HttpClientSingleton();
return instance.httpclient;
}
}

ClienteREST
package br.com.cactus.webservice;

import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;

import br.com.cactus.model.Dealer;

public class ClienteREST {

private static final String URL_WS = "http://10.0.2.2:8080/WebServiceREST/dealer/"; //"http://10.0.2.2:8080/WebServiceREST/cliente/"

public Dealer getDealer(int id) throws Exception {

String[] resposta = new WebServiceCliente().get(URL_WS + id);

if (resposta[0].equals("200")) {
Gson gson = new Gson();
Dealer dealer = gson.fromJson(resposta[1], Dealer.class);
return dealer;
} else {
throw new Exception(resposta[1]);
}
}

public List<Dealer> getListaDealer() throws Exception {

String[] resposta = new WebServiceCliente().get(URL_WS + "buscarTodosGSON");
// String[] resposta = new WebServiceCliente().get(URL_WS + "buscarTodos");

if (resposta[0].equals("200")) {
Gson gson = new Gson();
ArrayList<Dealer> listaDealer = new ArrayList<Dealer>();
JsonParser parser = new JsonParser();
JsonArray array = parser.parse(resposta[1]).getAsJsonArray();

for (int i = 0; i < array.size(); i++) {
listaDealer.add(gson.fromJson(array.get(i), Dealer.class));
}
return listaDealer;
} else {
throw new Exception(resposta[1]);
}
}

public String inserirDealer(Dealer dealer) throws Exception {

Gson gson = new Gson();
String dealerJSON = gson.toJson(dealer);
String[] resposta = new WebServiceCliente().post(URL_WS + "inserir", dealerJSON);
if (resposta[0].equals("200")) {
return resposta[1];
} else {
throw new Exception(resposta[1]);
}
}

public String deletarDealer(int id) {
String[] resposta = new WebServiceCliente().get(URL_WS + "delete/" + id);
return resposta[1];
}
}

Autor:  antunes [ 22 Out 2014, 14:49 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Silvio,

Desculpe-me pela demora, mas caso ainda não tenha conseguido resolver, segue a solução.

A partir da versão 3.x o Google "recomenda" que o acesso a internet deva ser feito fora da main thread, em uma outra thread.

Esse problema é bastante conhecido entre desenvolvedores android.

No nosso fórum tem bastante material sobre o assunto.

search.php?keywords=NetworkOnMainThreadException&terms=all&author=antunes&fid%5B%5D=1&sc=1&sf=all&sk=t&sd=d&sr=posts&st=0&ch=300&t=0&submit=Busca

viewtopic.php?f=7&t=17638&p=148894&hilit=Main+Thread#p148894
viewtopic.php?f=2&t=22733&p=151548&hilit=NetworkOnMainThreadException#p151548

Abraços!

silviobarretto escreveu:
Olá Antunes,
Criei o projeto com algumas alterações para adaptar ao meu projeto, estou usando um banco msyql. O meu webservice, está funcionando perfeitamente, retornando o json o banco. Mas qdo vou rodar pelo emulador dá erro "Falha na rede" e falha ao acessar o web service como abaixo:

09-03 15:47:12.921:
E/NGVL(658): Falha ao acessar Web service
09-03 15:47:12.921:
E/NGVL(658): android.os.NetworkOnMainThreadException
09-03 15:47:12.921:
E/NGVL(658): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
09-03 15:47:12.921:
E/NGVL(658): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
09-03 15:47:12.921:
E/NGVL(658): at libcore.io.IoBridge.connectErrno(IoBridge.java:144)
09-03 15:47:12.921:
E/NGVL(658): at libcore.io.IoBridge.connect(IoBridge.java:112)
09-03 15:47:12.921:
E/NGVL(658): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-03 15:47:12.921:
E/NGVL(658): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
09-03 15:47:12.921:
E/NGVL(658): at java.net.Socket.connect(Socket.java:842)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-03 15:47:12.921:
E/NGVL(658): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
09-03 15:47:12.921:
E/NGVL(658): at br.com.cactus.webservice.WebServiceCliente.get(WebServiceCliente.java:25)
09-03 15:47:12.921:
E/NGVL(658): at br.com.cactus.webservice.ClienteREST.getListaDealer(ClienteREST.java:31)
09-03 15:47:12.921:
E/NGVL(658): at br.com.cactus.app.Admin$2.onClick(Admin.java:61)
09-03 15:47:12.921:
E/NGVL(658): at android.view.View.performClick(View.java:4084)
09-03 15:47:12.921:
E/NGVL(658): at android.view.View$PerformClick.run(View.java:16966)
09-03 15:47:12.921:
E/NGVL(658): at android.os.Handler.handleCallback(Handler.java:615)
09-03 15:47:12.921:
E/NGVL(658): at android.os.Handler.dispatchMessage(Handler.java:92)
09-03 15:47:12.921:
E/NGVL(658): at android.os.Looper.loop(Looper.java:137)
09-03 15:47:12.921:
E/NGVL(658): at android.app.ActivityThread.main(ActivityThread.java:4745)
09-03 15:47:12.921:
E/NGVL(658): at java.lang.reflect.Method.invokeNative(Native Method)
09-03 15:47:12.921:
E/NGVL(658): at java.lang.reflect.Method.invoke(Method.java:511)
09-03 15:47:12.921:
E/NGVL(658): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
09-03 15:47:12.921:
E/NGVL(658): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-03 15:47:12.921:
E/NGVL(658): at dalvik.system.NativeStart.main(Native Method)


MEU CÓDIGO:
WebServiceCliente
package br.com.cactus.webservice;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;

import android.util.Log;

public class WebServiceCliente {

public final String[] get(String url) {

String[] result = new String[2];
HttpGet httpget = new HttpGet(url);
HttpResponse response;

try {
response = HttpClientSingleton.getHttpClientInstace().execute(httpget);
HttpEntity entity = response.getEntity();

if (entity != null) {
result[0] = String.valueOf(response.getStatusLine().getStatusCode());
InputStream instream = entity.getContent();
result[1] = toString(instream);
instream.close();
Log.i("get", "Result from post JsonPost : " + result[0] + " : " + result[1]);
}
} catch (Exception e) {
Log.e("NGVL", "Falha ao acessar Web service", e);
result[0] = "0";
result[1] = "Falha de rede!";
}
return result;
}

public final String[] post(String url, String json) {
String[] result = new String[2];
try {

HttpPost httpPost = new HttpPost(new URI(url));
httpPost.setHeader("Content-type", "application/json");
StringEntity sEntity = new StringEntity(json, "UTF-8");
httpPost.setEntity(sEntity);

HttpResponse response;
response = HttpClientSingleton.getHttpClientInstace().execute(httpPost);
HttpEntity entity = response.getEntity();

if (entity != null) {
result[0] = String.valueOf(response.getStatusLine().getStatusCode());
InputStream instream = entity.getContent();
result[1] = toString(instream);
instream.close();
Log.d("post", "Result from post JsonPost : " + result[0] + " : " + result[1]);
}

} catch (Exception e) {
Log.e("NGVL", "Falha ao acessar Web service", e);
result[0] = "0";
result[1] = "Falha de rede!";
}
return result;
}

private String toString(InputStream is) throws IOException {

byte[] bytes = new byte[1024];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int lidos;
while ((lidos = is.read(bytes)) > 0) {
baos.write(bytes, 0, lidos);
}
return new String(baos.toByteArray());
}
}


HttpClientSingleton
package br.com.cactus.webservice;

import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

public class HttpClientSingleton {

private static final int JSON_CONNECTION_TIMEOUT = 3000;
private static final int JSON_SOCKET_TIMEOUT = 5000;
private static HttpClientSingleton instance;
private HttpParams httpParameters;
private DefaultHttpClient httpclient;

private void setTimeOut(HttpParams params) {
HttpConnectionParams.setConnectionTimeout(params,
JSON_CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, JSON_SOCKET_TIMEOUT);
}

private HttpClientSingleton() {
httpParameters = new BasicHttpParams();
setTimeOut(httpParameters);
httpclient = new DefaultHttpClient(httpParameters);
}

public static DefaultHttpClient getHttpClientInstace() {
if (instance == null)
instance = new HttpClientSingleton();
return instance.httpclient;
}
}

ClienteREST
package br.com.cactus.webservice;

import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;

import br.com.cactus.model.Dealer;

public class ClienteREST {

private static final String URL_WS = "http://10.0.2.2:8080/WebServiceREST/dealer/"; //"http://10.0.2.2:8080/WebServiceREST/cliente/"

public Dealer getDealer(int id) throws Exception {

String[] resposta = new WebServiceCliente().get(URL_WS + id);

if (resposta[0].equals("200")) {
Gson gson = new Gson();
Dealer dealer = gson.fromJson(resposta[1], Dealer.class);
return dealer;
} else {
throw new Exception(resposta[1]);
}
}

public List<Dealer> getListaDealer() throws Exception {

String[] resposta = new WebServiceCliente().get(URL_WS + "buscarTodosGSON");
// String[] resposta = new WebServiceCliente().get(URL_WS + "buscarTodos");

if (resposta[0].equals("200")) {
Gson gson = new Gson();
ArrayList<Dealer> listaDealer = new ArrayList<Dealer>();
JsonParser parser = new JsonParser();
JsonArray array = parser.parse(resposta[1]).getAsJsonArray();

for (int i = 0; i < array.size(); i++) {
listaDealer.add(gson.fromJson(array.get(i), Dealer.class));
}
return listaDealer;
} else {
throw new Exception(resposta[1]);
}
}

public String inserirDealer(Dealer dealer) throws Exception {

Gson gson = new Gson();
String dealerJSON = gson.toJson(dealer);
String[] resposta = new WebServiceCliente().post(URL_WS + "inserir", dealerJSON);
if (resposta[0].equals("200")) {
return resposta[1];
} else {
throw new Exception(resposta[1]);
}
}

public String deletarDealer(int id) {
String[] resposta = new WebServiceCliente().get(URL_WS + "delete/" + id);
return resposta[1];
}
}

Autor:  alexprado [ 27 Out 2014, 13:56 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Olá, fiz o webservice em um projeto distinto do projeto android, e ao fazer o teste de inserção ele me traz um erro de NoClassDefFoundException quando crio uma instância da classe model dentro da activity... Como vc fez a importação de um projeto no outro??? Já tentei pelo Project References e até criei um JAR com o projeto do WebService e importei no projeto android, ele importa a classe normal mas me apresenta esse erro na linha de código referente à instancia da classe model...

Autor:  antunes [ 30 Out 2014, 15:40 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Eu simplesmente copiei as classes de um projeto para o outro!!

alexprado escreveu:
Olá, fiz o webservice em um projeto distinto do projeto android, e ao fazer o teste de inserção ele me traz um erro de NoClassDefFoundException quando crio uma instância da classe model dentro da activity... Como vc fez a importação de um projeto no outro??? Já tentei pelo Project References e até criei um JAR com o projeto do WebService e importei no projeto android, ele importa a classe normal mas me apresenta esse erro na linha de código referente à instancia da classe model...

Autor:  alexprado [ 30 Out 2014, 16:14 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Nesse Caso vc então copiou apenas as necessárias, certo??? A parte WebService ainda dependerá da execução do outro projeto...

antunes escreveu:
Eu simplesmente copiei as classes de um projeto para o outro!!

alexprado escreveu:
Olá, fiz o webservice em um projeto distinto do projeto android, e ao fazer o teste de inserção ele me traz um erro de NoClassDefFoundException quando crio uma instância da classe model dentro da activity... Como vc fez a importação de um projeto no outro??? Já tentei pelo Project References e até criei um JAR com o projeto do WebService e importei no projeto android, ele importa a classe normal mas me apresenta esse erro na linha de código referente à instancia da classe model...

Autor:  antunes [ 07 Nov 2014, 11:47 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Isso, copiei apenas os POJOs.

Abraços!

alexprado escreveu:
Nesse Caso vc então copiou apenas as necessárias, certo??? A parte WebService ainda dependerá da execução do outro projeto...

antunes escreveu:
Eu simplesmente copiei as classes de um projeto para o outro!!

alexprado escreveu:
Olá, fiz o webservice em um projeto distinto do projeto android, e ao fazer o teste de inserção ele me traz um erro de NoClassDefFoundException quando crio uma instância da classe model dentro da activity... Como vc fez a importação de um projeto no outro??? Já tentei pelo Project References e até criei um JAR com o projeto do WebService e importei no projeto android, ele importa a classe normal mas me apresenta esse erro na linha de código referente à instancia da classe model...

Autor:  Shadowph [ 01 Jun 2015, 21:17 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Estou seguindo o tutorial, mas estou com o seguinte erro:

java.lang.IllegalStateException: This is not a JSON Array.

Mas o web service está retornando Json corretamente...
Se puder me dar uma ajuda, agradeço.

Autor:  giuvane [ 30 Jul 2015, 16:35 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Boa tarde Antunes,

Primeiramente gostaria de te parabenizar pelo artigo, além de ser um ótimo tutorial, ele também é explicativo quanto as tecnologias aplicadas.

Eu implementei o seu exemplo e ele funcionou corretamente, exceto nos métodos de busca e exclusão, onde o cliente android envia parâmetros ao servidor.

Está dando o seguinte erro no servidor:

GRAVE: A message body reader for Java class int, and Java type int, and MIME media type application/octet-stream was not found.
The registered message body readers compatible with the MIME media type are:
application/octet-stream ->
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.RenderedImageProvider
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy



Segue o método onde recebo a chamada REST no servidor:

@GET
    @Path("/excluir/{id}")
    @Produces("application/json")
    public String excluir(@PathParam("id") int id) throws DAOException{
       
        //int idNew = Integer.parseInt(id);
        localDao = new LocalDAO();
       
        return localDao.excluir(id);
    }


Segue a classe android onde faço a chamada REST:

public String excluirLocal(int id) {
       
        String[] resposta = new WebServiceCliente().get(WebServiceConfig.URL_WS + "local/excluir/" + id);
        return resposta[1];
       
    }


Apenas alterei um pouco a forma de construir a URL, porém garanto que a URL passada está correta!

As classes WebServiceCliente e HttpClientSingleton estão exatamente como em seu exemplo! Eu acredito que o problema seja na leitura do "id" do tipo inteiro no lado do servidor ou na forma como esse id é passado. Sei que a anotação @PathParam deveria "saber" que existe um atributo sendo passado como parâmetro e deveria ler o parâmetro corretamente no servidor, porém acho que não está funcionamento corretamente.

Que outra forma eu poderia fazer esta passagem de parâmetro?

Autor:  giuvane [ 30 Jul 2015, 20:53 ]
Assunto do Tópico:  Re: [Artigo] Web Service RESTful 2 [+Consumir+Android+Code]

Só dando segmento a pergunta anterior, alterando o método para:

@GET
    @Path("/excluir")
    @Produces("application/json")
    public String excluir(@QueryParam("id") int id) throws DAOException{
       
        ...
    }


E passando o ID pela url da seguinte forma: http://......../local?id=id

Ele funciona, porém eu não gostaria de utilizar desta forma, gostaria de utilizar o @PathParam, alguém sabe o pq daquele comportamento???

Página 6 de 6 Todos os Horários estão como UTC - 2 horas [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/