Skip to content
marloncarvalho edited this page Aug 8, 2012 · 8 revisions

REST e JSON

Como você já deve saber, temos duas versões do serviço eQuizmo. Uma versão disponibiliza os dados através de REST e outra através de SOAP. Fizemos destas duas formas para você possa ter à sua disposição dois exemplos de conexão a serviços. Nesta seção, vamos falar sobre como você pode se conectar ao nosso servidor usando o REST no Android.

Bibliotecas Externas? Precisa?

Não! Não precisa ter nenhuma biblioteca externa para conectar e tratar o retorno de serviços REST/Json. Para falar a verdade, você faz uma conexão HTTP normal e depois basta tratar o retorno usando a biblioteca org.json que já vem nativamente no Android. Fácil, não é? Vamos lá.

Onde encontrar o código?

Você vai encontrar todos os serviços REST do eQuizmo no pacote br.gov.serpro.equizmo.service.rest. Lá temos todas as classes com o código necessário para conectar no nosso serviço REST.

Explicando

Vamos dar uma olhadinha na classe CategoryServiceRest.java, que está logo abaixo. Observe que temos uma classe chamada HttpUtil.java. Ela é responsável em fazer a conexão HTTP no servidor e obter a resposta. Esta resposta será simplesmente um texto, uma String contendo a resposta em JSON. Simples assim!

Agora, nós temos que passar esta resposta para um objeto do tipo JSONArray, iterar neste Array e criar os objetos Category a partir destas informações. Veja abaixo o código que faz isto.

public class CategoryServiceRest implements CategoryService {

	@Override
	public List<Category> getCategories() {
		final List<Category> result = new ArrayList<Category>();

		final String json = HttpUtil.doGet("http://quiz-exmo.rhcloud.com/rest/quiz/listCategories");
		try {
			final JSONArray jsonArray = new JSONArray(json);
			for (int index = 0, total = jsonArray.length(); index < total; index++) {
				result.add(new Category(jsonArray.getString(index)));
			}
		} catch (JSONException e) {
			throw new RuntimeException(e);
		}

		return result;
	}
}

Você quer ver como é a resposta do serviço? Basta clicar neste link http://quiz-exmo.rhcloud.com/rest/quiz/listCategories.

E essa HttpUtil? Fala mais sobre ela!

Bom, esta classe usa o projeto HttpClient da Apache! Mas fique tranquilo, pois você não precisa anexar nenhuma nova biblioteca ao seu projeto. O HttpClient da Apache já vem por padrão no Android. Fizemos um uso super simples do HttpClient, apenas para obter os dados de uma página usando o método HTTP chamado GET. Veja o código abaixo.

public class HttpUtil {

public static String doGet(String url) {
	try {
		URI uri = new URI(url);
		HttpGet get = new HttpGet(uri);
		HttpClient client = new DefaultHttpClient();

		ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
			public String handleResponse(final HttpResponse response) throws HttpResponseException, IOException {
					StatusLine statusLine = response.getStatusLine();
					if (statusLine.getStatusCode() >= 300) {
						throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
					}

					HttpEntity entity = response.getEntity();
					return entity == null ? null : EntityUtils.toString(entity, "UTF-8");
				}
			};
			return client.execute(get, responseHandler);
		} catch (ClientProtocolException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		} catch (URISyntaxException e) {
			throw new RuntimeException(e);
		}
	}

}

Achou o código complexo? Não se preocupe. Na verdade, é bem simples. Só precisamos de 3 objetos para realizar a conexão: HttpGet, HttpClient e ResponseHandler. A única complicação está no ResponseHandler, pois ele trata a resposta obtida quando você chama um endereço. Basicamente, verifica se o status é 300 ou maior (neste caso, ele não conseguiu acessar a página) e caso seja, lança uma exceção.

Caso contrário, vai tratar a resposta que provavelmente será um texto contendo o JSON.