No post anterior mostrei como criar um Web Service simples com o Jersey. Através dele podemos retornamos um arquivo JSON baseado no padrão RESTful.
Nesse pequeno POST, vou mostrar como ler os dados desse WS com o Android. O REST/JSON está tão forte que a Google já colocou nativamente no Android uma API para leitura desse tipo de arquivo. Então, dentro do seu projeto basta colocar os métodos abaixo:
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());
}
Esse primeiro método é uma "receita de bolo". Ele será pelo método getRESTFileContent(String) (a seguir) e servirá para ler byte-a-byte (na verdade de 1024 em 1024 bytes) o conteúdo do arquivo JSON que é retornado pelo servidor, retornando-o em forma de String.
public String getRESTFileContent(String url) {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
try {
HttpResponse response =
httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
String result = toString(instream);
instream.close();
return result;
}
} catch (Exception e) {
Log.e("NGVL", "Falha ao acessar Web service", e);
}
return null;
}
O método acima, utiliza o HttpClient (da Apache, que vem nativamente no Android) para estabelecer a conexão com o servidor, abrir o fluxo de leitura (InpuStream) e retornar o conteúdo do arquivo JSON em forma de String (feito pelo método toString(InputStream)).
private void lerTodasPessoas() {
String result = getRESTFileContent(
"http://10.0.2.2:8080/BlogWS_REST/rest/pessoas/");
if (result == null){
Log.e("NGVL", "Falha ao acessar WS");
return;
}
try {
JSONObject json = new JSONObject(result);
JSONArray pessoasArray =
json.getJSONArray("pessoa");
JSONObject pessoaJson;
for (int i = 0; i < pessoasArray.length(); i++) {
pessoaJson = new JSONObject(
pessoasArray.getString(i));
Log.i("NGVL",
"------------------------");
Log.i("NGVL",
"id="+ pessoaJson.getInt("id"));
Log.i("NGVL",
"nome="+ pessoaJson.getString("nome"));
}
} catch (JSONException e) {
Log.e("NGVL", "Erro no parsing do JSON", e);
}
}
private void lerUmaPessoa() {
// Observe o ID da pessoa no final da URL
String result = getRESTFileContent(
"http://10.0.2.2:8080/BlogWS_REST/rest/pessoas/1");
if (result == null){
Log.e("NGVL", "Falha ao acessar WS");
return;
}
try {
JSONObject pessoaJson = new JSONObject(result);
Log.i("NGVL",
"id="+ pessoaJson.getInt("id"));
Log.i("NGVL",
"nome="+ pessoaJson.getString("nome"));
} catch (JSONException e) {
Log.e("NGVL", "Erro ao fazer parsing do JSON", e);
}
}
Este é o método que deverá ser chamado diretamente e utilizará os demais. Inicialmente ele pega o conteúdo do arquivo JSON informando a URL do mesmo. Notem que foi usado o IP 10.0.2.2 estabelecido pelo Android para acessarmos um serviço da máquina local.
Em seguida, criamos o objeto JSON e a partir dele obtemos o array de pessoas. Esse array contém todos os objetos JSON do arquivo. Em seguida, iteramos sobre este array atribuindo à variável pessoaJson. E com essa variável pegamos a propriedade de cada objeto retornado.
Editado em 06/11/2011
Agora vou mostrar como passar um JSON para o nosso servidor inserir uma nova Pessoa.
private String inserirPessoa() {
try {
URL url = new URL(
"http://10.0.2.2:8080/BlogWS_REST/rest/pessoas/");
HttpURLConnection conexao =
(HttpURLConnection)url.openConnection();
conexao.setRequestMethod("POST");
conexao.addRequestProperty(
"Content-type", "application/json");
conexao.setDoOutput(true);
conexao.connect();
OutputStream os = conexao.getOutputStream();
os.write("{\"id\":\"1\",\"nome\":\"Nelson\",\"outro\":\"info1\"}".getBytes());
os.flush();
InputStream is = conexao.getInputStream();
return toString(is);
} catch (Exception e) {
e.printStackTrace();
return "ERRO!";
}
}
Este método abre a conexão com o servidor, mas desta vez para fazer um POST ao invés de um GET. Ele passará um objeto JSON que representa um objeto Pessoa no servidor através de um OutputStream. Aqui colocamos um JSON hard-coded, mas você poderia utilizar a bibilioteca GSON do Google para converter seus objetos em JSON.
[/Editado]
Dois detalhes: 1) toda comunicação deve ser feita na Thread separada da UI. Logo chame o método acima dentro de uma outra Thread ou use a abordagem da AsyncTask que eu mostrei nesse post. 2) Você deve adicionar a permissão android.permission.INTERNET no seu AndroidManifest.XML conforme abaixo:
<uses-permission android:name="android.permission.INTERNET"/>
Qualquer dúvida deixem seus comentários.
4br4ç05,
nglauber