J2ME + PHP --> OutputStream

Bom dia!

Estou desenvolvendo um midlet para Palm OS
Preciso ler os dados de um RecordStore e enviar via HTTP para um site da web.

A idéia é que no site exista um arquivo .php esperando por um parâmetro. Esse parâmetro será o que vai pelo OutputStream da midlet.
O programa .php deve pegar o parâmetro e gerar um arquivo texto gravando o conteúdo do parâmetro.

Alguém sabe se isso funciona?
Já viu algum material explicando sobre isso?
Poderia por favor me indicar?

Um abraço,

Rodrigo S. Bento

E ae Icewind.
Isso que você está imaginando funciona sim.
No momento estou utilizando em um projeto mais ou menos essa situação que você mencionou.

Vou te passar um trecho de um código que pode te auxiliar:

...
HttpConnection http = null;
        OutputStream os = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        
        try
        {
            http = (HttpConnection)Connector.open(url); //Url do arquivo PHP
            
            //tipo de pedido 
            http.setRequestMethod(HttpConnection.POST);
            
            //Envia informacoes de cabecalho, exigido no POST
            http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            
            //Envia dados.
            os = http.openOutputStream();

            byte data[];
            data = ("nome=Pedpano").getBytes();
            os.write(data);
            
            data = ("&idade=21").getBytes();
            os.write(data);
            os.flush();

... //continua normalmente

Nesse caso por exemplo to passando via POST para um arquivo PHP as variáveis “nome” e “idade” cujos os conteúdos são, “Pedpano” e “21”. Agora é só programar o PHP para receber essas variáveis e realizar o que você quiser.

Fala pedpano

Muito obrigado pela dica e exemplo…mas preciso de mais um pouco de sua ajuda…
Testei várias vezes o código que você me passou, mas o arquivo php não recebe o parâmetro.
Se eu digitar na barra de endereço do browser ele recebe, mas pelo palm não está indo.
Teria como você me ajudar?

Dê uma olhada no arquivo php:


<?php

if ($param != “”)
{
echo($param);

$conteudo = $param;

$arquivo = “output.txt”;

if (!$abrir = fopen($arquivo, “w”)) {
echo “Erro abrindo arquivo ($arquivo)”;
exit;
}

if (!fwrite($abrir, $param)) {
print “Erro escrevendo no arquivo ($arquivo)”;
exit;
}

echo “Arquivo gravado com Sucesso !!”;

fclose($abrir);

}
else
{
echo(“falhou…param não chegou!”);
}


Obrigado!

Um abraço,

Rodrigo.

Ae.
Esse é o arquivo php que você está utilizando?

Bom primeiro você precisa captar as variáveis que você vai passar utilizando o J2ME.

Se você utilizar o GET no J2ME você captura as váriáveis assim no php:

$HTTP_GET_VARS[‘nome da variavel’];

Se for POST:

$HTTP_POST_VARS['nome da variavel];

Bom basicamente deve ser por isso que sua aplicação php não deve estar funcionando corretamente, teste ai.

Fala pedpano!

Respondeu rapidão hein…valeu!

Viu…eu testei sua dica…usei o HTTP_POST_VARS[‘param’], mas mesmo assim não funcionou…

Estou postando minha classe java e o arquivo .php para você dar uma olhada.

Se puder me ajudar seria muito bom cara…ninguém nunca respondeu esse tipo de pergunta.

veja:


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import javax.microedition.io.*;
import java.util.*;
import java.io.*;

public class ExportarRemessa extends Form implements CommandListener
&#123;
    AcademusPDA midlet;
    Command cmVoltar, cmTest;
    private StringItem siExportarRemessa;
    private String rms = null;
    
    public ExportarRemessa&#40;String title, AcademusPDA md, String armazem&#41;
    &#123;
        // Chama o construtor
        super&#40;title&#41;;
        
        // Salva uma referência para o gerenciador de telas
        midlet = md;
        
        // Nome do armazém de registros a ser aberto para chamada
        rms = armazem;             

        siExportarRemessa = new StringItem&#40;&quot;armazém&#58; &quot;, rms&#41;;
        cmVoltar = new Command&#40;&quot;Voltar&quot;, Command.SCREEN, 1&#41;;
        cmTest = new Command&#40;&quot;Testar&quot;, Command.SCREEN, 1&#41;;
        
        append&#40;siExportarRemessa&#41;;
        addCommand&#40;cmVoltar&#41;;
        addCommand&#40;cmTest&#41;;
        setCommandListener&#40;this&#41;;
    &#125;
    
    public void commandAction&#40;Command c, Displayable d&#41;
    &#123;
        if &#40;c == cmVoltar&#41;
        &#123;
            midlet.exibe.popDisplayable&#40;&#41;;
        &#125;
        
        if &#40;c == cmTest&#41;
        &#123;
            testeOutput&#40;&#41;;
        &#125;
    &#125;
    
    public void testeOutput&#40;&#41;
    &#123;
        HttpConnection http = null;
        OutputStream os = null;
        String url = &quot;http&#58;//localhost/palm/param.php&quot;;
        try
        &#123;
            http = &#40;HttpConnection&#41;Connector.open&#40;url&#41;; //Url do arquivo PHP

            //tipo de pedido
            http.setRequestMethod&#40;HttpConnection.POST&#41;;

            //Envia informacoes de cabecalho, exigido no POST
            http.setRequestProperty&#40;&quot;Content-Type&quot;, &quot;text/plain&quot;&#41;;

            //Envia dados.
            os = http.openOutputStream&#40;&#41;;

            byte data&#91;&#93;;
            data = &#40;&quot;param=icewind&quot;&#41;.getBytes&#40;&#41;;
            os.write&#40;data&#41;;
            os.flush&#40;&#41;;
        &#125;
        catch&#40;Exception e&#41;
        &#123;
            midlet.exibe.msg&#40;e.toString&#40;&#41;&#41;;
        &#125; 
        finally
        &#123;
            try
            &#123;
                if&#40;http != null&#41;
                &#123;
                   http.close&#40;&#41;;
                &#125;
                if&#40;os != null&#41;
                &#123;
                   os.close&#40;&#41;;
                &#125;
            &#125;
            catch&#40;Exception e&#41;
            &#123;
                midlet.exibe.msg&#40;e.toString&#40;&#41;&#41;;
            &#125;
        &#125;
    &#125;    
&#125;

&lt;?php

if &#40;$HTTP_GET_VARS&#91;'param'&#93;&#41;
&#123;
   $param = $HTTP_GET_VARS&#91;'param'&#93;;

   echo&#40;$param&#41;;  

   $conteudo = $param;

   $arquivo = &quot;output.txt&quot;;

   //TENTA ABRIR O ARQUIVO TXT
   if &#40;!$abrir = fopen&#40;$arquivo, &quot;w&quot;&#41;&#41; &#123;
   echo &quot;Erro abrindo arquivo &#40;$arquivo&#41;&quot;;
   exit;
   &#125;

   //ESCREVE NO ARQUIVO TXT
   if &#40;!fwrite&#40;$abrir, $param&#41;&#41; &#123;
   print &quot;Erro escrevendo no arquivo &#40;$arquivo&#41;&quot;;
   exit;
   &#125;

   echo &quot;Arquivo gravado com sucesso !!&quot;;

   //FECHA O ARQUIVO 
   fclose&#40;$abrir&#41;;
&#125;
else
   &#123;
      echo&#40;&quot;falhou.....param não chegou!&quot;&#41;;
   &#125;
?&gt;

Muito obrigado pela sua atenção!

Um abraço,

Rodrigo

[color=“red”]
Vamos tentar colocar as tags code… fica muito mais legívle o codigo!
[/color]

pedpano…considere HTTP_POST_VARS[‘param’] na mensagem anterior…eu tinha mudado para get para testar e copiei errado.

Mas mesmo assim não deu certo…

Tem alguma idéia!

T+

Rodrigo

pedpano…

FUNCIONOU!

mas só com GET…com post não…vc tem alguma idéia!?

Um abraço,

Rodrigo

Ae.

Como não tinha a sua classe “AcademusPDA” pra testar seu Midlet usei o seguinte código pra testar seu arquivo PHP e funcionou blz, com POST.
Dê uma olhada nesse código:

[code]import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class TestePost extends MIDlet
{
Display dsTela;
String url = "http://dream.viaceu.com.br/testes/testePost.php";
Form form1;

public TestePost&#40;&#41;
&#123;
    form1 = new Form&#40;&quot;dd&quot;&#41;;
	dsTela=Display.getDisplay&#40;this&#41;;
&#125;

protected void startApp&#40;&#41; throws MIDletStateChangeException 
&#123;
	
	//dsTela.setCurrent&#40;form1&#41;;
	try &#123;
        conectar_post&#40;url&#41;;
    &#125; catch &#40;IOException e&#41; &#123;
       
        e.printStackTrace&#40;&#41;;
    &#125;
&#125;

protected void pauseApp&#40;&#41; &#123;
&#125;
protected void destroyApp&#40;boolean arg0&#41; throws MIDletStateChangeException &#123;
&#125;

public void conectar_post&#40;String url&#41; throws IOException
&#123;
    HttpConnection http = null;
    OutputStream os = null;
    InputStream is = null;
    ByteArrayOutputStream baos = null;
    
    try
    &#123;
        http = &#40;HttpConnection&#41;Connector.open&#40;url&#41;;
        
        //tipo de pedido
        http.setRequestMethod&#40;HttpConnection.POST&#41;;
        
        //Envia informacoes de cabecalho, exigido no POST
        http.setRequestProperty&#40;&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;&#41;;
        
        //Envia dados.
		os = http.openOutputStream&#40;&#41;;
        byte data&#91;&#93;;
        data = &#40;&quot;param=pedpano&quot;&#41;.getBytes&#40;&#41;;
        os.write&#40;data&#41;; 
         os.flush&#40;&#41;;
        
        
        //Resposta do servidor
       // is = http.openInputStream&#40;&#41;;
        
        if &#40;http.getResponseCode&#40;&#41; == HttpConnection.HTTP_OK&#41;
		&#123;
                     
		    // 2&#41; Get header information - No header

		    // Pegando os dados vindos do servidor
		    int ch;
		    is = http.openInputStream&#40;&#41;;
		    baos = new ByteArrayOutputStream&#40;&#41;;
		    while &#40;&#40;ch = is.read&#40;&#41;&#41; != -1&#41;
     		&#123;
		        // Ignore any carriage returns/linefeeds
		        if &#40;ch != 10 && ch != 13&#41;
     	        baos.write&#40;ch&#41;;
     		&#125;

		    
		
		    String sResultado = new String&#40;baos.toByteArray&#40;&#41;&#41;;

		    System.out.println&#40;sResultado&#41;;
		&#125;
	&#125;
  	finally
  	&#123;
  	    // Clean up -----naum entendi muito bem....
  	    if &#40;is != null&#41;
  	        is.close&#40;&#41;;
  	    if &#40;baos != null&#41;
  	        baos.close&#40;&#41;;
  	    if &#40;http != null&#41;
  	        http.close&#40;&#41;;
  	&#125;
  
&#125;

}[/code]

Fala pedpano…

Valeu pelas dicas…funcionaram!

Mas agora existe um outro problema…não sei se vc passou por isso.

Quando eu envio o arquivo via outputstream POST para uma URL, o php retorna um erro:

HTTP_LENGTH_REQUIRED

chunked-Transfer-Encoded Forbidden

O que será…tem idéia…?

Um abraço,

Rodrigo

Opa.
Nunca ocorreu esse erro comigo…
Deu esse erro no mesmo código PHP que você postou? Se for eu testei com esse mesmo código e não deu erro nenhum.

Pedpano,

Testei o código de vcs e funcionou legal. Mas tenho uma dúvida:

Ao invés de enviar somente o parâmetro “param” poderia eu enviar um
conjunto maior de dados para serem então armazenados (como um arquivo txt) no servidor com PHP? Vc saberia como?

Exemplo de dados que eu pretendo enviar:

X Y

1 0.4
2 0.3
3 0.7
4 0.8
5 0.2
6 0.1

desde já agradeço pela ajuda,

Geraldof

Fala Geraldo…belesma?

Então, pelo que eu entendi você conseguiu enviar parâmetros para um arquivo PHP, mas quer enviar mais parâmetros…

O que eu sugiro é o seguinte:

1- você pode criar vários parâmetros e concatená-los…afinal no fim tudo é texto, depois despacha tudo com write(); — não precisa usar o flush();

2- você pode criar somente 1 parâmetro ‘param’ e os dados você concatena com algum caracter de separação [pode ser pipe | ou ponto-e- vírgula;] e envia um parâmetro só bem grande e trata ele no php com explode("|",$param);

Depois de fazer uma das formas, e tendo recebido o parâmetro no php, você criar um arquivo texto por lá, no formato que quiser montar.

Eu já fiz isso e funcionou.

Qualquer dúvida, estamos por aí para tentar ajudar!

Espero ter ajudado.

Rodrigo Bento