Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Augusto

"Índice Auto Atribuído" de valores enviados via POST...

Recommended Posts

Vou tentar matar dois coelhos u=com uma paulada só?

 

Primeiro:

 

Quando se faz uma requisição de envio POST pelo Flash, há algum índice auto-atribuído à matriz gerada recebida do lado servidor?

 

Por exemplo: Se eu enviar o campo nome via POST para algo em PHP entre formulários, devo receber como $_POST['nome']. Quando envio pelo Flash, recebo da mesma forma?

 

Ou algum índice é auto-atribuído, bidimensionalizando a matriz, como $_POST['algumacoisa']['nome']?

 

Segundo

 

Como funciona as requisições de envio POST feitas pelo Flash. Estou analiando o código-fonte de um sistema aqui, feito em AS2, mas não consigo compreender a lógica:

 

- Há uma função que que recebe dois parâmetros, sendo o primeiro aquilo que será enviado e outro, pelo que andei lendo, onde o resultado, isto é, a resposta do servidor, será armazenado.

- Nessa função há uma variável que instancia uma classe de manipulamento XML e, logo abaixo é chamado variavel.sendAndLoad()

 

Até aí tudo bem. Fui procurar nessa classe de manipulamento o tal método sendAndLoad()

 

Nesse método, o "aquilo queserá enviado", que é um objeto, é transformado em XML.

Em seguida, outra variável instancia uma classe XmlDocument derivada de XML e invoca seu respectivo sendAndLoad().

Como nessa XmlDocument não encontro tal método, suponho que ele herde de XML, mas a coisa é muito vaga para mim que não sou da área.

 

Alguém me explica, nos miúdinhos, o que se passa nos bastidores?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No AS2 você tem como fazer uma requisição no php e ele ja retornar como xml diretamente e o flash ja tratar como xml, pra isso você cria um objeto do tipo XML no flash, e dele você terá as propriedades load() que chama o php e o php através de uma query no banco ja retorna o xml pro flash, e o flash através do onLoad do xml recebe esse XML feito pelo php, por exemplo:

 

var xml: XML = new XML();
xml.ignoreWhite = true; // Faz o flash ignorar os espa~ços em branco vindos do xml;
xml.load("arquivo.php?variavel=valor); // aqui o php receberá a variável como get
xml.onLoad = function(){
   trace(this); // Aqui o this se refere ao objeto xml, então ele retornará tudo o que o php passar como xml, o trace é apenas para uso de desenvolvimento do flash, que mostra o resultado num painel de desenvolvimento
}

Já no LoadVars, o flash consegue tambem mandar e receber, tambem consegue só mandar ou só receber, ele tem os 3 métodos, load, send e sendAndLoad, no seu caso, para que você envie variáveis e receba, você vai primeiro criar o objeto loadvars, depois declarar as variáveis e valores que quer mandar, e por último enviar e aguardar a resposta do php pra receber, então ficaria assim:

 

var manda: LoadVars = new LoadVars();

// aqui você cria todas as váriáveis para mandar pro php ja com seus valores

 

manda.nome = "José";

manda.idade = "23";

manda.telefone = "8888-8888";

manda.mensagem = "Alguma mensagem";

 

// Criado as variáveis no loadVars, agora você teria os 3 parametros mencionados, que são a url, o objeto no caso criei o "manda" e o método se é post ou get:

 

manda.sendAndLoad("arquivo.php", manda, "post");

 

// Aqui o flash executa a função somente quando o php faz o retorno para o flash

 

manda.onLoad = function(){

trace(this.resultado);

trace(this.mensagem);

}

 

No caso, pro flash receber a variavel, ela deve ser iniciada com "&" e atribuido o valor com "=" e se possível tambem finalzada com "&", ficando seu php mais ou menos assim:

 

echo "&resultado=enviado&&mensagem=Alguma outra mensagem&";

 

lembrando que o "&" encerra qquer variavel mandada para o flash, então é assim que você deve formatar as variáveis para enviar para o flash, somente dizendo que todas elas chegam como String no flash, se por acaso você mandar pro flash algo como:

 

echo "&valor=1200&";

 

para que o flash use o 1200 como número, você deve usar parseInt para inteiro ou parseFloat para flutuante, ficando assim:

 

manda.onLoad = function(){

var numero: Number = parseInt(this.valor);

trace(numero + 10); //retortna 1210

}

 

acho que é isso.

 

abraço,

 

Carneirinho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, sua explicação se adequou bem à segunda pergunta.

 

Mas e quando NÃO HÁ esse LoadVars? Como que é possível esse envio POST de um XML acontecer?

 

Vou postar parte do código, que não é de minha autoria, apenas trocando alguns nomes:

 

Todos os envios são realizados com essa chamada:

 

_root.core.chamaXML(_loc3, objTarget, this.url, 2);
_loc3 é o objeto com os valores que serão convertidos em XML por esse chamaXML()

objTarget é um objeto vazio onde, pelo que entendi, será armazenado o XML retornado pelo site.

this.url é um URL string, em texto simples.

O 2 informa à chamaXML() que tipo de XML será gerado, por questões criptografia.

 

Nesse chamaXML() tem:

 

core.chamaXML = function (objSource, objTarget, strPage, intMode, strKey)
{
    var _loc1 = new MeuXML();
    _loc1.source = objSource;
    _loc1.target = objTarget;
    _loc1.filename = strPage;
    if (intMode == 2)
    {
        _loc1.bTotalEncryption = true;
    } // end if
    if (strKey != undefined)
    {
        _loc1.strKey = strKey;
    } // end if
    _loc1.sendAndLoad();
};
Como eu disse no primeiro post, _loc1 instancia uma classe XML que, acredito eu, seja responsável pelo envio, pois é nela que consta o sendAndLoad() que você citou.

Também altera alguma propriedades dessa classe MeuXML associando os parâmetros.

 

Até aí beleza.

 

Nesse MeuXML instancia-se uma XmlDocument que estende XML.

No método load() há variável com outra instância de XMlDocument, nomeada como retorno, com uma chamada ao load() que acredito vir herdado de XML, carregando o arquivo de this.url

 

No sendAndLoad(), que seria onde a mágica acontece, o objeto a ser enciado é convertido em XML e o sendAndLoad() da XmlDocument é chamado tendo como parâmetros o arquivo a ser carregado (this.url) e o objeto onde as informações de retorno serão armazenadas.

 

Por fim, nessa XmlDocument que não tem sendAndLoad() (daí a suposição de ser herdado) tem, no onLoad() a conversão do XML retornado pela página em objeto, manipulável pelo Flash.

 

Ufa! Muita coisa para demonstrar que, em nenhum momento eu vejo LoadVars, referência à método POST nem nada. E, quando eu envio o XML eu recebo uma mensagem de erro porque, de fato não é o que ele espera.

 

Isso tudo significa o que? Que não um POST que está sendo feito?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse sendAndLoad do XML pelo o que eu vi, funciona bem parecido com o do LoadVars, porem nunca cheguei a usar em alguma aplicação, mas tem aqui um tópico de um usuário comentando e usando esse sendandload do xml, que ao meu ver é o mesmo funcionamento, dá uma lida e veja se isso tira a sua dúvida:

 

http://forum.imasters.com.br/index.php?/topic/173589-sendandload/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não ajudou muito. Mas pelo que eu entendi, esse sendAndLoad() é um misto de POST com GET. A parte send, seria POST, a parte Load, GET.

 

Conclui isso a partir daqui

 

Mas ainda assim não recebo a resposta esperada pelo site alvo.

 

Voltando o foco para a primeira questão, do tal índice auto atribuído, nesse uso do sendAndLoad do Flash, ele existe? Pelo link que você passou esse índice seria HTTP_RAW_POST_DATA

 

Procede?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não sei como o php trata as variáveis, mas o flash faz objeto bidimencional, uma vez fiz um teste usando essa conversa com o amfphp, que você pode procurar na net. O flash só resgata variáveis como se fosse um get mesmo e pra enviar, ele manda por get ou post. O melhor que faço é sempre trabalhar com xml para restagar variáveis, assim quando receber eu posso trabalhar com elas da maneira que eu quiser, criando os próprios objetos no flash

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por exemplo: Se eu enviar o campo nome via POST para algo em PHP entre formulários, devo receber como $_POST['nome']. Quando envio pelo Flash, recebo da mesma forma?

 

Ou algum índice é auto-atribuído, bidimensionalizando a matriz, como $_POST['algumacoisa']['nome']?

 

esse índice é a própria instância da class XML ou LoadVars (elas funcionam da mesma forma)

esses valores só estão disponível, depois do evento onLoad

o carneirinho mostrou isso lá em cima:

 

se no PHP, você mandou:

 

&mensagem=blabal

no flash:

 

var manda: XML = new XML ();
manda.onload = function(){
   trace(manda.mensagem);
}

o índice nesse caso é o próprio objeto, por ser uma classe dinâmica, ele cria

as variareis dinamicamente

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, se o Flash mandar via POST o valor de um campo de texto chamado nome, se entendi bem via this.nomedocampo.text dentro de um XML, no PHP (ou qualquer outra linguagem) eu recebo, por exemplo, $_POST['nome_do_objeto_XML']['nome']

 

O objeto XML é o nome da classe certo? Se for, como esse programa usa uma classe chamada XmlDocument, eu recebo $_POST['XmlDocument']['nome']

 

Correto?

 

P.S.: Flash é muito difícil :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, o php vai receber só como $_POST['nome'], o flash vai usar o manda.nome = nomedocampo.text; o manda.nome está atribuindo uma variável nome ao objeto manda que é um loadVars.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então tá certo. Dar certode fato não deu, deve ser alguma verificação adicional que o site faz que impede essa conexão externa quando o ambiente que envia não seja um APlicativo Flash.

 

E quanto a cabeçalhos? O Flash envia algum automaticamente? Seja de Content-type, de expiração, host...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.