Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
skcratch

[Resolvido] - Fazer parsing em PHP de HTTP Response (obter cabeçalho e conteúdo)

Recommended Posts

skcratch

Viva!

Será que alguém me poderia indicar como fazer parsing de uma HTTP Response em PHP? O cabeçalho da resposta é um cabeçalho comum, enquanto que o corpo se encontra em XML.

Grato desde já pela ajuda,

Cumps!

:P

Share this post


Link to post
Share on other sites
skcratch

Viva!

Eu estou a desenvolver um cliente que comunica com um servidor que está ser desenvolvido em Java. Basicamente, utilizamos o HTTP como protocolo de comunicação, sendo que o corpo das mensagens é sempre em XML.

Este é o exemplo de uma resposta do servidor:

HTTP/1.0 200 OK

Content-Type: text/plain

Date: Mon, 2 Mar 2009 17:44:25 GMT

iptvxml=<?xml version="1.0" encoding="UTF-8"?>

<communication xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<command name="CommandResponse"/>

<response name="OK" data="null" description="ClientServiceProvider: User Authenticated."/>

</communication>

Aquilo que pretendo, é retirar o cabeçalho da resposta do HTTP e fazer o parsing da restante mensagem.

Grato desde já pela ajuda,

Cumps!

:P

Share this post


Link to post
Share on other sites
pedrotuga

Bem, esse é um caso em que o mapeamento automático feito pelo PHP não é preciso.

Podes ir buscar informação sobre o pedido a vários sítios, por exemplo ao array superglobal $_SERVER

http://se2.php.net/manual/pt_BR/reserved.variables.server.php

Mas isso pode tornar-se pouco pratico e deve ser limitado em muitos casos.

Mais vale enviares e receberes os pedidos ou usando a libcurl ou usando simplesmente sockets. Usa a que te parecer mais facil. Para qualquer um dos casos, lê o manual!

http://se.php.net/manual/pt_BR/book.sockets.php

http://se.php.net/manual/pt_BR/book.curl.php

Ah ok... mas a pergunta é como fazer o parsing. Tens várias opções.

Primeira coisa... divide os cabeçalhos do resto da mensagem. Os cabeçalhos estão antes da primeira linha que contem apenas um \n, o resto é a mensagem.

Par parsar os cabeçalhos... isso vai mesmo à mão...

divide linha, antes do ':' está o nome, depois vem o conteudo.

Para parsar a mensagem... Simplexml!

http://se.php.net/manual/pt_BR/book.simplexml.php

Share this post


Link to post
Share on other sites
skcratch

Viva!

A informação está a ser enviada através de um socket, sobre o qual envio um pedido HTTP, podendo ser GET ou POST.

O código que cria o pedido é o seguinte:

fputs($fp, "$method $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp,"Content-type: text/plain\r\n");
    fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    if ($useragent) {
        fputs($fp, "User-Agent: MSIE\r\n");
    }
    fputs($fp, "Connection: close\r\n\r\n");

onde a variável $data corresponde a uma string XML que foi criada de acordo com um XML Schema previamente estabelecido entre mim (cliente) e o meu colega (servidor).

A resposta do servidor está a ser obtida da seguinte forma:

do {
     $buf .= fgets($fp, 1024);
} while (!feof($fp));

É sobre a variável $buf que pretendo realizar o parsing. Em primeiro lugar, retirar o cabeçalho do HTTP Response; depois fazer o parsing do conteúdo XML. Para realizar essa operação, tenho que guardar a string XML num ficheiro ou posso operar directamente sobre a variável?

Grato desde já pela ajuda,

Cumps!

:P

Share this post


Link to post
Share on other sites
djthyrax

O separador header-conteúdo do protocolo http é \n\n ou \r\n\r\n. Por isso, basta pores tudo numa string e fazeres:

$pecas = explode("\n\n", str_replace(array("\r\n", "\r"),"\n", $texto);
echo "Headers: ", $pecas[0], "\n\n";
echo "Conteudo: ", $pecas[1], "\n\n";


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
pedrotuga

Fazes como te der mais jeito. Se usares o snippet que o tirácio acabou de afixar já tens o conteudo numa variável para fazeres o que quiseres com ele.

Envia isso para o simplexml e tens o problema resolvido.

Share this post


Link to post
Share on other sites
skcratch

Viva!

Antes de mais, obrigado aos dois pela ajuda. Adaptando o snippet que o djthyrax forneceu, funcionou tudo na perfeição. Agora, tal como sugeriu o pedrotuga, vou usar o simplexml para realizar o parsing do conteúdo.

Cumps!

:P

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.