1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Envio de Json do android para Controller por Post

Bom Dia,

Estou tentando enviar através de post um Json do meu App Android para minha aplicação web feita com VRaptor. O Post parece sair normalmente do Android, mas não entra no método da controller. O que pode ser?

WebClient no Android responsável pelo envio:

package br.com.projeto.websupport;

import java.io.BufferedReader;
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class WebClient extends AsyncTask<Object, Object, String> {

    private String url;
    private String json;
    private Context context;
    private ProgressDialog progressDialog;

    public WebClient(String json, Context context) {
        this.json = json;
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(context, "Aguarde", "Enviando",true,true);
    }

    @Override
    protected String doInBackground(Object... arg0) {
        return post();
    }

    public String post() {
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();

            HttpPost post = new HttpPost(getUrl());

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
            nameValuePairs.add(new BasicNameValuePair("jsonPost", json));
            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse response = httpClient.execute(post);

        } catch (ClientProtocolException e) {
            return "0";
        } catch (EOFException e) {
            return "0";
        }// end Try
    }// fim do método

    @Override
    protected void onPostExecute(String result) {
        progressDialog.dismiss();
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

}// fim da classe

A controller que deve receber o json do post:

@Resource
public class AssinaturaController {

    private UsuarioWeb usuarioWeb;
    private Result result;
    private AssinaturaDao dao;
    private UtilImagem utilImagem;
    private Validator validator;
    private Imagens imagens;

    public AssinaturaController(UsuarioWeb usuarioWeb, Result result,
            AssinaturaDao dao, UtilImagem utilImagem, Validator validator,
            Imagens imagens) {
        this.usuarioWeb = usuarioWeb;
        this.result = result;
        this.dao = dao;
        this.utilImagem = utilImagem;
        this.validator = validator;
        this.imagens = imagens;

    }

    @Post
    public void adiciona(final UploadedFile imagem) {

        utilImagem.gravaImagem(imagem);

        Assinatura assinatura = new Assinatura();
        assinatura.setNomeFoto(imagem.getFileName());
        assinatura.setUsuario(usuarioWeb.getUsuario());

        dao.adiciona(assinatura);

        result.redirectTo(AssinaturaController.class).novo();
    }

    //////////////////////////////////////////////
    //ESSE É O MÉTODO QUE DEVE RECEBER O JSON. MAS QUE NÃO ESTA ENTRANDO!
    //////////////////////////////////////////////
    @Path("/assinatura/adicionaJson")
    @Post
    public void adiciona(String jsonPost) {

        Calendar cal = Calendar.getInstance();
        cal.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        String nomeDaFoto = sdf.format(cal.getTime()).replace("-", "")
                .replace(":", "");

        //utilImagem.gravaImagem(jsonPost, nomeDaFoto);

    }

}

O trecho de código na Activity que chama a WebClient:

byte[] imagemBase64 = data.getByteArrayExtra("imagemBase64");

String imagemJson = new Gson().toJson(imagemBase64);

WebClient webClient = new WebClient(imagemJson, MainActivity.this);
webClient.setUrl(url + "assinatura/adicionaJson");
webClient.execute();
webView.loadUrl(url);

A URL que sai do android esta assim: http://192.168.X.XX:8080/projeto/assinatura/adicionaJson

  • Leonardo, ainda estou estudando o VRaptor, mas na minha experiência com Spring, o seu método "adiciona" não deveria conter alguma anotação para indicar que "String jsonPost" está no corpo da requisição e não é uma variável do próprio request (tipo @RequestBody (do Spring)!)???

    Jose Marcos Gomes   05 de fev de 2014
  • Boa Tarde Jose, pode me dar um exemplo de como ficaria? Não conheço Spring. :D

    Leonardo Tonin Neto   05 de fev de 2014
  • Leonardo, se seu método fosse em Spring seria algo assim:

    ' @RestController public class AssinaturaController {

    @RequestMapping(method = RequestMethod.POST, value="/assinatura/adicionaJson") public void adiciona(@RequestBody JavaBeanComDados jsonPost) {

    Calendar cal = Calendar.getInstance(); cal.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); String nomeDaFoto = sdf.format(cal.getTime()).replace("-", "") .replace(":", "");

    //utilImagem.gravaImagem(jsonPost, nomeDaFoto);

    } '

    Jose Marcos Gomes   05 de fev de 2014
  • Observar que "jsonPost" é um JavaBean com getters e setters para os atributos dos dados json que você estiver recebendo no seu controller.

    Jose Marcos Gomes   05 de fev de 2014
  • Eu acho (ainda sem muita convicção) que você, usando VRaptor, deve anotar '@Consumes("application/json")' no seu método "adiciona"!

    Jose Marcos Gomes   05 de fev de 2014
Mostrar todos os 8 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags vraptor android post ou faça a sua própria pergunta.