Receber json em web service REST

Boa noite.
Estou com problemas em receber um arquivo do meu cliente android.
Crei um web service rest, só que não sei como que recebo no POST.

Eu testei com um web service .net e deu certo, so que preciso fazer em java.

No android eu fiz a seguinte linha que envia:

               Arquivo a = new Arquivo(); (essa classe tem os get's set's)
		a.setConteudo(arquivoBase64);
		a.setNome("MeuArquivoPDF.pdf");
		a.setTamanho(1000);
               GsonBuilder b = new GsonBuilder();
	       Gson        j = b.create();
	       String      json = j.toJson(a);

               List<NameValuePair> parametros = new ArrayList<NameValuePair>();
	        parametros.add(new BasicNameValuePair("json", json));
	        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parametros,HTTP.UTF_8);
	        req.setEntity(formEntity);

No Web Service eu tentei:

   @POST
   @Path("/ja")
   @Produces("application/json")
   @Consumes("application/json")
   public String ja(@PathParam("MeuArquivoPDF") String json){
  
        try {
            byte[] bytes = json.getBytes();  
            File file = new File("MeuArquivoPDF.pdf"); 
            BufferedOutputStream bos = null;
            bos = new BufferedOutputStream(new FileOutputStream(file)); 
            bos.write(bytes); 
            bos.close(); 

            return "Deu Certo";
        } catch (Exception ex) {
            return "Deu Errado!";
    }
    }

Como que faço para receber no meu ws? Eu recebo como String mesmo? O que fiz ali está no caminho? Porque do jeito que está ali não está dando certo.

Me ajude por favor.

Obrigada

vc pode manter como string , se vc quer saber como faz um post com o apache httpclient olha esse exemplo: http://wiki.apache.org/HttpComponents/QuickStart

Então… pelo que vi, esse post é para enviar para meu ws, no caso já está enviando.

O meu problema é como receber esse json que está com a string de bytes… preciso montar o arquivo e salvá-lo

Abaixo um exemplo para enviar uma imagem:

@GET
@Path("{id}")
@Produces("image/pdf")
public byte[] getPortrait(@PathParam("id") Long id) {
	Arquivo arquivo = recuperaArquivo(id);
	return arquivo.getDados();
}

Obs: Já pensou em postar no GUJ Perguntas?

[]'s

nesse caso como pelo que parece o conteúdo do seu json não é apenas o conteúdo do arquivo pdf e sim um objeto do tipo arquivo com atributos conteúdo ,
nome do arquivo e tamanho , então no seu webservice vc não vai receber um pdf e sim um simples json do seu objeto arquivo. O que vc vai fazer é deserializar o json no servidor com gson para um objeto do tipo Arquivo e vai pegar o conteudo que com o getConteudo fazer o decode da base64 e salvar o seu arquivo pdf no servidor. Tudo isso porque não está enviando um arquivo pdf serializado e sim um objeto do tipo Arquivo. Mas acho que ao invés de enviar o arquivo vc poderia simplesmente enviar o conteudo apenas e só gerar o pdf no servidor.

Outra coisa:

Se você quiser receber uma entidade como JSON, o mais aconselhável é que você mapeie a sua entidade da maneira apropriada e trabalhe com essa entidade (ao invés de utilizar Strings).

[]'s

Arquivo a = new Arquivo(); (essa classe tem os get's set's) a.setConteudo(arquivoBase64); a.setNome("MeuArquivoPDF.pdf"); a.setTamanho(1000); GsonBuilder b = new GsonBuilder(); Gson j = b.create(); String json = j.toJson(a); req.setEntity(json);

e no Webservice crie uma classe Arquivo com os mesmo parametros e com mapeamentos Xml

[code] @POST
@Path("/ja")
@Produces(“application/json”)
@Consumes(“application/json”)
public String ja(Arquivo json){

     try {  
         File file = new File("MeuArquivoPDF.pdf");   
         BufferedOutputStream bos = null;  
         bos = new BufferedOutputStream(new FileOutputStream(file));   
         bos.write(arquivo.getConteudo());   
         bos.close();   
  
         return "Deu Certo";  
     } catch (Exception ex) {  
         return "Deu Errado!";  
}  
}  [/code]

Boa noite Sergio…

Obrigada pela ajuda.
Mas ali quando crio o Arquivo e busco no meu webservice subentende-se que está em um mesmo pacote.

Mas no caso, por especificação passada, eu tive que criar a aplicação android no eclipse e o meu web service no net beans.
Desculpe, mas nesse caso como que recebo o Arquivo json? Realmente estou confusa.

Não tenho experiencia com java, e estou sofrendo para conseguir ajuda sem que me interpretem de forma que eu “queria que façam por mim”, e sim que me instruam.

Obrigada desde já.

Simplesmente crie essa mesma classe Arquivo no seu projeto,não faz diferença onde está localizada.

eu criei ela… mas na linha:

no arquivo pede para criar a classe arquivo…
aí eu coloquei Arquivo arquivo = new Arquivo();
mas mesmo assim nessa linha da erro, acusa:
no suitable method found for write(String), method BufferedOutputStream.write(byte[],int,int)…

Tenta passar assim:

bos.write(arquivo.getConteudo().getBytes());       

Pelo que eu to vendo o seu problema não é lidar com webservices e sim com coisas básicas do java, recomendo estudar um pouco mais.

Boa noite.

Eu concordo plenamente com voce Ramon, não entendo de programação. Por isso estou sofrendo para desenvolver meu projeto.

Eu andei pesquisando e alterei o meu web service, que ficou assim:

package com;

import com.google.gson.Gson;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@Path("/hello")
public class Hello {

    @POST
    @Consumes("application/json")
    @Produces("text/xml")
    public String ja(@PathParam("json") String json) throws IOException {

        Gson gson = new Gson();
        Arquivo arquivo = gson.fromJson(json, Arquivo.class);

        byte[] decoded = Base64.decodeFromFile(arquivo.getConteudo());

        try {
            File file = new File("teste.pdf");
            BufferedOutputStream bos = null;
            bos = new BufferedOutputStream(new FileOutputStream(file));
            bos.write(decoded);
            bos.close();
            return "Deu Certo";
        } catch (Exception ex) {
            return "Deu Errado!";
        }
    }
}

Pelo que eu “acho” a lógica está certa, eu recebo uma String la do meu android, aí uso a biblioteca gson para tirar do object json, faço o decode do base64 e guardo em um byte[] e depois escrevo os bytes e monto o arquivo.

Só que o problema é que o post não está recebendo a minha String. Eu fiz um teste com o GET, mandando “OI EU SOU O SERVIDOR”, e apareceu no meu emulador, sinal que realmente o meu web service e a aplicação android estão se comunicando.

Mas não estou conseguindo identificar onde está o problema. Estou pesquisando mas não encontro nada que me ajude, acredito que ainda mais pelo fato de eu não ter conhecimento da linguagem aí acaba dificultando mais ainda para entender. E pretendo estudar mais afundo sobre java, só que no momento não tenho tempo hábil para começar desde o princípio até chegar no mais complexo, que é o meu caso hoje.

Obrigada pela atenção.

você chegou a debugar método ja do seu webservice para ver o qual é o valor que ele está recebendo como parâmetro ou se gera alguma exception?

Não… não consegui no net beans… Do eclipse que tem a aplicação android sim, e esta enviando certo