Como enviar uma solicitação GET do PHP?

280

Estou planejando usar o PHP para um requisito simples. Preciso fazer o download de um conteúdo XML de um URL, para o qual preciso enviar uma solicitação HTTP GET para esse URL.

Como faço isso em PHP?

Veera
fonte

Respostas:

378

A menos que você precise mais do que apenas o conteúdo do arquivo, você poderá usá-lo file_get_contents.

$xml = file_get_contents("http://www.example.com/file.xml");

Para algo mais complexo, eu usaria cURL .

Sasha Chedygov
fonte
3
Isso está correto, a menos que você precise usar parâmetros de sequência de caracteres de consulta.
Raptor
2
@ musicicreak: às vezes, a string de consulta é ignorada por alguns servidores para configurações de segurança. Além disso, a consulta entre servidores pode resultar neste erro:failed to open stream: HTTP request failed!
Raptor
26
@ShivanRaptor: Não tenho certeza do que você está falando ... A string de consulta é apenas parte dela. Não há razão para um servidor ignorá-lo. Agora, obviamente, file_get_contentsnão permite que você faça a solicitação com cookies, cabeçalhos e outras coisas personalizadas que um navegador normalmente envia; portanto, você pode não obter a resposta que estava procurando. Nesse caso, seria melhor usar CURL de qualquer maneira. (Mas isso não é o caso do OP.)
Sasha Chedygov
1
Curl é muito mais rápido que file_get_contents. Prefira Curl sobre file_get_contents em um ambiente de alto tráfego
Deb
2
@Sasha - Eu já enfrentei isso em muitos ambientes de produção, mas você pode ver esses links por enquanto: haltiko.blogspot.com/2013/02/… ou mdb9.wordpress.com/2011/03/06/…
Deb
132

Para solicitações GET / POST mais avançadas, você pode instalar a biblioteca CURL ( http://us3.php.net/curl ):

$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
James Skidmore
fonte
10
Embora realmente não haja necessidade de usar CURL para um "requisito simples", +1, porque é realmente a melhor solução para fazer algo mais avançado com solicitações HTTP em PHP.
Xyz
Como já mencionado, o enrolamento é muito mais rápido que file_get_contents(). Uma sequência simples de 4 letras levou cerca de 10 segundos, enquanto a curvatura levou um máximo mais razoável de ~ 1 segundo.
Peter Gordon
@pgmann Você tem certeza desse resultado? isso não está de acordo com outras estatísticas com o que foi citado. De fato, o CURL é mais rápido, mas não deve ser muito mais rápido. Talvez essa queda no tempo de resposta tenha sido causada pelo cache de algum recurso no servidor, etc.? Talvez você deva repetir o teste?
Rauni Lillemets
1
@Rauni Acho que não posso testar novamente, mas sempre uso cURL para aumentar a velocidade, etc. Os tempos de solicitação são aproximados, como era o carregamento da página. Eu tentei várias vezes.
Peter Gordon
63

http_getdeve fazer o truque. As vantagens do http_getexcesso file_get_contentsincluem a capacidade de exibir cabeçalhos HTTP, acessar detalhes da solicitação e controlar o tempo limite da conexão.

$response = http_get("http://www.example.com/file.xml");
William Brendel
fonte
83
A extensão http não é fornecida com o PHP e geralmente não está disponível em hosts compartilhados.
7789 Imran
27
isso requer pecl_http> = 0.1.0, que não está instalado por padrão.
Raptor
5
"A página do manual que você está procurando ( us2.php.net/manual/en/function.http-get.php ) não está disponível neste servidor no momento."
Pang
20

Lembre-se de que, se você estiver usando um proxy, precisará fazer um pequeno truque no seu código php:

(PROXY WITHOUT AUTENTICATION EXAMPLE)

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'proxy:8080',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
?>
pepe
fonte
9

Dependendo da configuração do php permitir a abertura de URLs, você também pode simplesmente abrir a URL com os argumentos get na string (como http://example.com?variable=value )

Editar: relendo a pergunta Não tenho certeza se você deseja passar variáveis ​​ou não - se não estiver, pode simplesmente enviar a solicitação fopen contendo http://example.com/filename.xml - fique à vontade ignorar a variável = parte do valor

Zxaos
fonte
5

Eu gosto de usar o fsockopen open para isso.

Pbreitenbach
fonte
5

Por outro lado, o uso da API REST de outros servidores é muito popular no PHP. Suponha que você esteja procurando uma maneira de redirecionar algumas solicitações HTTP para outro servidor (por exemplo, obtendo um arquivo xml). Aqui está um pacote PHP para ajudá-lo:

https://github.com/romanpitak/PHP-REST-Client

Então, obtendo o arquivo xml:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();
Mostafa
fonte
5

O Guzzle é uma biblioteca muito conhecida, que torna extremamente fácil realizar todo tipo de chamadas HTTP. Consulte https://github.com/guzzle/guzzle . Instale com composer require guzzlehttp/guzzlee execute composer install. Agora, o código abaixo é suficiente para uma chamada http get.

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
Mark Baaijens
fonte