GARANTIR DESCONTO

Fórum Enviar dados em POST com Java SE #446559

24/06/2013

0

Pessoal,

Tenho um pouco de experiencia como desenvolvedor em Desktop utilizando Java SE, e nada de experiencia como Java Web. Me encontro com o desafío de ter que enviar dados desde uma aplicaçao minha (Desktop) para um servidor web via 'Post'.

A idea e a seguinte, desde uma aplicaçao que administra um Clube deportivo na qual atualmente eu ja disponho de uma funcionalidade para gerar recibos de mensalidades eu gostaría de integrarla a um site que tem a funcionalidade de gerar uma especie de boleto bancario que pode ser pago em qualquer loterica. Este site disponibiliza uma API PHP para que desenvolvedores integrem sus aplicaçoes com este serviço. O formulario debe ser o seguinte:

<input name="Cobrosya[token]" value="b76adcc734b25a81ce1b5b37798a8af0" type="hidden">
<input name="Cobrosya[concepto]" value="Inscripcion Evento A" type="hidden">
<input name="Cobrosya[monto]" value="200" type="hidden">
<input name="Cobrosya[url]" value="https://cobrosya.com/api/ejemplos/ej2/comprar.php" type="hidden">
<!--opcionales !-->
<input name="Cobrosya[fecha_vencimiento]" value="12/12/2013" type="hidden">
<!-- Si se desea enviar el talon por mail luego de crearlo !-->
<input name="Cobrosya[enviar]" value="1" type="hidden">
<!--en dolares !-->
<input name="Cobrosya[moneda]" value="840" type="hidden">
<!-- fin opcionales !-->
<label class="left" for="nombre">Ingresá tu nombre:</label>
<input class="left" id="nombre" name="Cobrosya[nombre]" type="text"><br>
<label class="left" for="email">Ingresá tu email:</label>
<input class="left" id="email" name="Cobrosya[email]" type="text"><br>
<input class="right" value="Comprar" type="submit">


A pergunta é a seguinte, de que forma eu poderia enviar estes paramentros em um 'Post' desde minha aplicaçao desktop? é posivel isto? ou terei que criar um servlet? Em fim preciso de uma ajuda para encontrar um caminho donde iniciar os estudos.

Até onde pesquisei aparentemente podería ser feito utilizando a classe HTTPUrlConnection, o codigo que eu fiz até o momento sem susseço e o seguinte:

 public void enviaFormulario(){
        
        try {
            parametrosURL = "Cobrosya[token]=e3fd7270dff8d77c01bda18288f21fa2&Cobrosya[concepto]='prueba'&Cobrosya[monto]=40&Cobrosya[nombre]='Diego'&Cobrosya[email]='noblediego@hotmail.com'";
            request = "https://cobrosya.com/talon/crearNuevoTalon";
            url = new URL(request);
            conexion = (HttpURLConnection) url.openConnection();
            conexion.setDoOutput(true);
            conexion.setDoInput(true);
            conexion.setInstanceFollowRedirects(false);
            conexion.setRequestMethod("POST");
            conexion.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conexion.setRequestProperty("charset", "utf-8");
            conexion.setRequestProperty("Content-Length", "" + Integer.toString(parametrosURL.getBytes().length));
            conexion.setUseCaches(false);

            wr = new DataOutputStream(conexion.getOutputStream());
            wr.writeBytes(parametrosURL);
            wr.flush();
            wr.close();
            conexion.disconnect();
        } catch (MalformedURLException ex) {
            Logger.getLogger(PruebasURLConnection.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PruebasURLConnection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


Pesso desculpas pelas faltas ortográficas...

Obrigado
Diego Mello

Diego Mello

Responder

Posts

25/06/2013

Marcelo Senaga

É possível sim. Você poderia usar o HttpClient da Apache para enviar uma requisição POST e receber o conteúdo. Escrevi um artigo sobre isso:

https://www.devmedia.com.br/realizando-login-em-sites-utilizando-java/27283

Tente fazer e qualquer dúvida eu te ajudo.
Responder

Gostei + 0

25/06/2013

Diego Mello

É possível sim. Você poderia usar o HttpClient da Apache para enviar uma requisição POST e receber o conteúdo. Escrevi um artigo sobre isso:

https://www.devmedia.com.br/realizando-login-em-sites-utilizando-java/27283

Tente fazer e qualquer dúvida eu te ajudo.


Muito obrigado pela dica!

Estou adaptando o código que vc postou, tirando linhas e tratando de simplificar um pouco, depois de eu fazer funcionar tentarei "embelezar" um pouco. O código esta assim pelo momento:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;


public class PruebasURLConnection {

    private final DefaultHttpClient client = new DefaultHttpClient();

    public void generarRecibo(final String token, final String concepto, final String nombre, final String monto,
            final String fecha_vencimiento, final String email, final String enviar, final String moneda) throws UnsupportedEncodingException, IOException {

        /* Método POST */
        final HttpPost post = new HttpPost("https://cobrosya.com/talon/crearNuevoTalon");

        //Configura pará metros POST
        final List<NameValuePair> nameValuePairs =
                new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[token]", token));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[concepto]", concepto));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[nombre]", nombre));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[monto]", monto));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[fecha_vencimiento]", fecha_vencimiento));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[email]", email));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[enviar]", enviar));
        nameValuePairs.add(new BasicNameValuePair("Cobrosya[moneda]", moneda));
       
        //post.setEntity(new UrlEncodedFormEntity(nameValuePairs, Consts.UTF_8));

        post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0");

        /* Ejecuta el POST */
        HttpResponse response = client.execute(post);

        System.out.println("Respuesta del servidor: " + response.getStatusLine());

    }

    public void close() {
        client.getConnectionManager().shutdown();
    }

    public static void main(String[] args) {

        PruebasURLConnection generar = new PruebasURLConnection();

        try {
            // Tenta efetuar login
            generar.generarRecibo("e3fd7270dff8d77c01bda18288f21fa2", "Prueba","Diego",
                    "40","25/06/2013","noblediego@hotmail.com","1","858");
           
            generar.close();
            
        } catch (UnsupportedEncodingException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}



Estou com algumas dificuldades, espero que possa me ajudar. O site diz que é possivel analizar o código de resposta para saber e resultado da transaçao, poreem nao estou sabendo como encaixar isto no código, montei um switch para analizar o código de retorno:

String resposta= response.toString();// variavel para analizar o response, nao esta funcionando
        switch (resposta) {
            case "0":
                System.out.println("El talón ha sido creado exitosamente y enviado por mail");
            case "1":
                System.out.println("El talón ha sido creado exitosamente");
            case "2":
                System.out.println("Ha habido un error al crear el talón");
            case "3":
                System.out.println("El token no es correcto");
            case "4":
                System.out.println("Faltan campos obligatorios");
            case "5":
                System.out.println("El mail tiene un formato incorrecto");
            case "6":
                System.out.println("La fecha de vencimiento es incorrecta");
            case "7":
                System.out.println("La moneda no es valida(858 Pesos o 840 Dólares");
            case "8":
                System.out.println("El monto no es numérico");
            case "9":
                System.out.println("El celular tiene un formato incorrecto");
                break;
            default:
                throw new AssertionError();
        }


Meu código nao esta dando nenhum erro mas também nao esta funcionando jeje por isso quero analizar o retorno pra tentar descubir o que esta errado, tal vez seja algum detalhe no código... em fim espero que possam me ajudar.

Muito obrigado.
Responder

Gostei + 0

26/06/2013

Diego Mello

Logrei solucionar e ta funcionando! Posto aqui o código é espero seja de ajuda a mais alguem:

        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        String respuesta = "";
        while ((respuesta = rd.readLine()) != null) {
            switch (respuesta) {
                case "0":
                    System.out.println("El talón ha sido creado exitosamente y enviado por mail");
                    break;
                case "1":
                    System.out.println("El talón ha sido creado exitosamente");
                    break;
                case "2":
                    System.out.println("Ha habido un error al crear el talón");
                    break;
                case "3":
                    System.out.println("El token no es correcto");
                    break;
                case "4":
                    System.out.println("Faltan campos obligatorios");
                    break;
                case "5":
                    System.out.println("El mail tiene un formato incorrecto");
                    break;
                case "6":
                    System.out.println("La fecha de vencimiento es incorrecta");
                    break;
                case "7":
                    System.out.println("La moneda no es valida(858 Pesos o 840 Dólares");
                    break;
                case "8":
                    System.out.println("El monto no es numérico");
                    break;
                case "9":
                    System.out.println("El celular tiene un formato incorrecto");
                    break;
                default:
                    throw new AssertionError();
            }
        }
Responder

Gostei + 0

28/06/2013

Marcelo Senaga

Parabéns pela solução. Desculpe pela demora na resposta.
Responder

Gostei + 0

29/06/2013

Joel Rodrigues

Como o problema foi solucionado, estou marcando o tópico como concluído.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar