Envio de dados com PHP utilizando método POST sem usar formulário HTML

Mais um probleminha que pode atrapalhar a vida de um programador PHP. Ao precisar enviar dados para uma página de um servidor remoto, normalmente para integrar seu sistema a algum outro sistema remoto geralmente feito em uma linguagem inferior (aka. ASP) e usando o método POST dentro do seu programa, sem poder utilizar um formulário e mandar o usuário clicar, usando apenas uma URL.

Bem, a tarefa seria simples se pudéssemos utilizar o método GET. Usando o método GET, poderíamos simplesmente acessar a url remota usando header() e depois redirecionar novamente para o nosso sitema a partir do arquivo remoto. No meu caso eu tinha que mandar 3 variáveis (assunto,e-mail e texto) para um arquivo .asp em outro servidor – e claro, o programador deste quis tirar onda comigo mandando eu enviar com método POST. Enfim, é claro que eu resolvi o problema e deixei ele chupando o Bill Gates.

Após horas de pesquisas e após ler muito no manual do PHP, descobri que poderia usar a extensão curl para tal, porém isso é complicado, pois nem sempre ela estará disponível no servidor do cliente. A solução que encontrei foi criando um contexto de stream, enviando-o em seguida ao servidor remoto usando fopen() e em seguinda, checando a resposta com stream_get_contents() pra saber se o conteúdo foi enviado corretamente ao servidor. Abaixo, a função concebida:

function POST($url, $dados, $headers = false)
{
     /*parâmetros necessários para criar um
        contexto de stream */
     $params = array('http' => array(
                     'method' => 'POST',
                     'content' => $dados ));
     //caso você precise enviar algum cabeçalho a mais
     if ($headers)
        $params['http']['header'] = $headers;
     //cria o contexto de stream
     $ctx = stream_context_create($params);

     //abre o arquivo remoto
     $fp = @fopen($url, 'rb', false, $ctx);
     //checa se o arquivo foi aberto com sucesso
     if (!$fp)
        throw new Exception("Problema com $url: -  $php_errormsg");
     //obtém a resposta
     $resp = @stream_get_contents($fp);

     /*checa se os dados do arquivo remoto
       foram lidos corretamente*/
     if ($resp === false)
        throw new Exception("Problema ao ler dados de $url: -  $php_errormsg");

     return $resp;
}


Exemplo de uso da função:


$url='http://seusite.com.br/arquivo.php';
$variaveis='nome=Andresa&time=palmeiras&tarefa=salvar';

POST($url, $variaveis);
  1. Oi Andressa,

    Eu achei esse teu artigo pesquisando no google, e acho que ele poderá me ajudar a corrigir uma falha de segurança no componente Joomla que eu mantenho…

    Mas o exemplo de uso da tua função não aparece aqui, teria como tu atualizares o blog, ou mandar esse código pra mim por e-mail?

    Desde já agradeço.

    Antônio

  2. Andresa disse:

    Para os usuários de Firefox:

    Estou usando o Google Highlight Sintax para formatar os códigos que escrevo, e o Firefox parece ser o único navegador que não está exibindo corretamente. Segue abaixo o código com o exemplo de uso da função, e reforço a minha sugestão de começarem a usar o Opera ^^

    < ?php $url='http://seusite.com.br/arquivo.php';
    $variaveis='nome=Andresa&time=palmeiras&tarefa=salvar';

    POST($url, $variaveis);
    ?>

  3. Rafael disse:

    Oi, e se eu precisar usar o POSR($url,$variaveis); dentro de uma tag <a> como procedo?
    Obrigado!

  4. Rafael disse:

    sim realmente não tinha entendido, infelizmente a função não serve pra o que eu precisava..
    e Nossa que velocidade de resposta huahuah , obrigado pela atenção.
    no caso preciso gerar um link que passe uma variavel e mandar para um cliente x via email , um email de confirmaçao…seria mais facil com o get, mas da margem a hackers para derrubar o sistema, visto que a variavel aparece, por isso precisava fazer com post…
    obrigado mais uma vez

    • Andresams disse:

      Você vai ter que ser um pouquinho mais especifico. Por exemplo, se você for mandar um boleto para um cliente, você deveria clicar em cima do nome do seu cliente e mandar um link assim:

      http://servidor/email_boleto.php?id_cliente=5

      Daí, dentro da página email_boleto.php, você faz um SELECT e pega os dados do cliente e os dados do boleto de dentro do banco de dados. Caso você vá mandar um texto fixo para o seu cliente, você pode colocar esse texto dentro do proprio arquivo email_boleto.php. No final do arquivo, você usa:

      header("Location: http://seuservidor/pagina_de_sucesso.php");
      exit;

      e assim já sairia de uma página para outra praticamente direto. Se você estiver usando login com sessões nesta página, não precisará se preocupar com "hackers".

      Outra coisa que você poderia fazer é usar AJAX nesse link, assim não apareceria a URL.

      A última opção seria você fazer um link que enviasse um formulário com a id do cliente via POST.

  5. Fracisco disse:

    Gostei muito do código

  6. Francisco disse:

    Você pode me falar qual seria o melhor método para envio de arquivos grandes para o servidor ?

  7. José Carlos disse:

    Andresams imagine que eu tenho 2 sistemas web cada um em um servidor digamos que eu faça login no sistema X porem tenho um link para ir para o sistema Y mas como eu ja realizei login no sistema X é possivel utilizar sua função enviando os dados de login (usuário/senha) para o servidor Y… assim eu faço login num sistema e fico logado nos 2 ?
    fiz um teste mas não deu certo… a ideia é tipo como o Google utiliza em seus sistemas vc faz login no orkut e quando acessa gmail já esta logado… mas se nao me engano o google utiliza Single Sign On (SSO)

  8. Andresams disse:

    Eu vou dar uma pesquisada sobre isso e amanhã te posto uma resposta mais completa, mas há várias formas de você fazer isso. Com relação à função acima, isso não é possível se você não estiver controlando a sessão do usuário pelo banco de dados, porque no momento em que o PHP cria uma sessão, ele também cria o cookie de sessão na máquina do usuário e esse cookie é necessário para o PHP associar o usuário com a sessão dele.

    Pra dizer a verdade, estou planejando fazer algo parecido, então eu vou dar uma estudada esta noite e amanhã antes deste horário eu te respondo, OK!

    Obrigada por prestigiar o meu blog!

  9. dimerson disse:

    ola !!! queria saber como eu faço pra enviar de um programa para o site um arquivo .txt e depois enviar para um email ? sendo que no programa ele ja cria o .txt so nao estou conseguindo enviar para o site e depois para um email . minha dificuldade seria so na parte do php etc…

    obrigado .

  10. dimerson disse:

    Olá !!! obrigado por responder …. no .TXT nao vai conter o email de destino, meu programa esta pre-configurado com o meu email ,… no caso ele ira usar o site para autenticar o envio do email com o .txt
    em ralaçao a enviar o .txt para URL , eu acho que sim … mas se vc poder me da uma luz eu agradeço rsrs….. so para lembrar , meu programa cria o arquivo ( .TXT) mas nao consigo enviar para o meu email via URL ,
    entao tive a ideia que seria a configuraçao da url o erro ,…

  11. Andresa disse:

    "no caso ele ira usar o site para autenticar o envio do email com o .txt"

    O PHP não pode "autenticar" o envio do e-mail, quem autentica o envio do email é o servidor SMTP. O que o PHP pode fazer são duas coisasa:

    1. Enviar um e-mail através de um servidor SMTP
    2. Enviar um email usando a sua função mail(), mas só funciona se o PHP estiver em um servidor Linux.

    Você não me falou qual linguagem de programação está usando, mas para enviar um arquivo ao PHP é necessário enviar um formulário usando o método POST. Descubra como se faz isso na linguagem do seu programa. No PHP, o código do arquivo deve ser o seguinte:
    <?php

    //Pega o conteúdo do seu TXT
    $conteudo_txt=file_get_contents($_FILES['arquivo']['tmp_name']);

    //Envia o e-mail
    mail("seu_email@email.com","assunto", $conteudo_txt) ;

    ?>

    "entao tive a ideia que seria a configuraçao da url o erro" << Como assim?

    Mas ao invés de fazer isso usando o PHP, talvez fosse muito mais simples você ver na linguagem que está programando como se faz isso e se tem algum plugin/componente para fazer isso, porque todas as linguagens tem.

  12. XXX disse:

    Muito bom

    CyberDownload 2_A REVOLUÇÃO DOS MÉTODOS DE DOWNLOADS!!!

  13. Hereck Santin disse:

    No meu caso esta dando o seguinte erro.

    Fatal error: Call to undefined function post() in /home/hnetsistemas/public_html/catalogo/layouts/pers_decorvelas/descricao.php on line 313

    O que pode ser?

    Obrigado

  14. Andresa disse:

    Pelo erro, parece que você não copiou o código da função para seu arquivo descricao.php. Você deve copiar todo o código antes de chamar a função:

    function POST($url, $dados, $headers = false)
    {
    /*parâmetros necessários para criar um
    contexto de stream */
    $params = array('http' => array(
    'method' => 'POST',
    'content' => $dados ));
    //caso você precise enviar algum cabeçalho a mais
    if ($headers)
    $params['http']['header'] = $headers;
    //cria o contexto de stream
    $ctx = stream_context_create($params);

    //abre o arquivo remoto
    $fp = @fopen($url, 'rb', false, $ctx);
    //checa se o arquivo foi aberto com sucesso
    if (!$fp)
    throw new Exception("Problema com $url: – $php_errormsg");
    //obtém a resposta
    $resp = @stream_get_contents($fp);

    /*checa se os dados do arquivo remoto
    foram lidos corretamente*/
    if ($resp === false)
    throw new Exception("Problema ao ler dados de $url: – $php_errormsg");

    return $resp;
    }

  15. patrik disse:

    Obrigado
    Obrigado
    Obrigado
    Obrigado
    Obrigado
    Obrigado
    Obrigado
    Obrigado
    Obrigado
    Obrigado

    esse post é bom d+++++.

  16. Matoso disse:

    Tua função ajudou muito obg msm !

  17. Diogo disse:

    como faço para passar os valores no GET mas eles estando dentro de variáveris exemplo:

    $variaveis=’nome=$nome&email=$mail&vip=$vip’;

    eu tento mas os valores não vão =/

  18. Diogo disse:

    Já resolvi bastava trocar ‘ por ”

    $variaveis=”nome=$nome&email=$mail&vip=$vip”;

    =]

  19. Mabmaster disse:

    Como faço para enviar dados (curriculo) para um email , sem que o usuario visualize o endereço. Por exemplo, no site da Catho, clica-se num link e envia-se o curriculo, sem visualizar para qual email que esta sendo enviado. Alguem sabe como fazer??

  20. Diego disse:

    Oie… Andresa, eh eu estou com um probleminha, talvez vc possa me ajudar…, tipo eu gostaria de enviar uma variável em formato post, utilizando a função header(), pois necessito encaminhar o usuário até a pagina com essa função header(Location:”pagina?variavel”), eu preciso fazer desta forma por causa do uso de meus templates…, não posso fazer via Get no header, por causa do limite de caracteres dos browsers , então tem alguma forma de se fazer isso???? Obrigado!!!!

Spam protection by WP Captcha-Free

line
footer
Powered by Wordpress | Adaptado por Andresa Martins