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

skcratch

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

8 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é que queres fazer? O php faz isso por si próprio.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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";

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora