¿Cómo enviar una solicitud GET desde PHP?

280

Estoy planeando usar PHP para un simple requisito. Necesito descargar un contenido XML de una URL, para lo cual necesito enviar una solicitud HTTP GET a esa URL.

¿Cómo lo hago en PHP?

Veera
fuente

Respuestas:

379

A menos que necesite más que solo el contenido del archivo, puede usarlo file_get_contents.

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

Para cualquier cosa más compleja, usaría cURL .

Sasha Chedygov
fuente
3
Esto es correcto, a menos que necesite usar parámetros de cadena de consulta.
Raptor
2
@musicfreak: la cadena de consulta a veces es ignorada por algunos servidores para la configuración de seguridad. Además, la consulta entre servidores puede provocar este error:failed to open stream: HTTP request failed!
Raptor
26
@ShivanRaptor: No estoy seguro de lo que estás hablando ... La cadena de consulta es solo parte de la cadena. No hay razón para que un servidor lo ignore. Ahora, obviamente, file_get_contentsno le permite realizar la solicitud con cookies personalizadas, encabezados y otras cosas que un navegador normalmente enviaría, por lo que es posible que no obtenga la respuesta que estaba buscando. En ese caso, sería mejor usar CURL de todos modos. (Pero ese no es el caso del OP.)
Sasha Chedygov
1
Curl es mucho más rápido que file_get_contents. Prefiero Curl sobre file_get_contents en un entorno de alto tráfico
Deb
2
@Sasha: me he enfrentado a esto en muchos entornos de producción, pero por ahora puedes ver estos enlaces: haltiko.blogspot.com/2013/02/… o mdb9.wordpress.com/2011/03/06/…
Deb
132

Para solicitudes GET / POST más avanzadas, puede instalar la 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
fuente
10
Aunque realmente no hay necesidad de usar CURL para un "requisito simple", +1, porque es realmente la mejor solución para hacer algo más avanzado con solicitudes HTTP en PHP.
xyz
Como ya se mencionó, el rizo es mucho más rápido que file_get_contents(). Una cadena simple de 4 letras tomó alrededor de 10 segundos, mientras que el rizo tomó un máximo razonable de ~ 1 segundo.
Peter Gordon
@pgmann ¿Estás seguro de ese resultado? Esto no está en línea con otras estadísticas con lo que se ha citado. De hecho, CURL es más rápido, pero no debería ser mucho más rápido. ¿Tal vez esta caída en el tiempo de respuesta provino del almacenamiento en caché del lado del servidor de algún recurso, etc.? Tal vez deberías repetir la prueba?
Rauni Lillemets
1
@Rauni, me temo que no puedo volver a probar, pero siempre utilizo cURL para el aumento de velocidad, etc. Los tiempos de solicitud son aproximados, lo que se siente al cargar la página. Lo intenté varias veces.
Peter Gordon
63

http_getdebería hacer el truco. Las ventajas de http_getover file_get_contentsincluyen la capacidad de ver encabezados HTTP, detalles de solicitudes de acceso y controlar el tiempo de espera de la conexión.

$response = http_get("http://www.example.com/file.xml");
William Brendel
fuente
83
La extensión http no está incluida en PHP y, a menudo, no está disponible en hosts compartidos.
Imran
27
esto requiere pecl_http> = 0.1.0, que no está instalado por defecto.
Raptor
55
"La página del manual que está buscando ( us2.php.net/manual/en/function.http-get.php ) no está disponible en este servidor en este momento".
Pang
20

Recuerde que si está utilizando un proxy, necesita hacer un pequeño truco en su 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
fuente
9

Dependiendo de si su configuración de php permite fopen en URL, también podría simplemente buscar la url con los argumentos get en la cadena (como http://example.com?variable=value )

Editar: releyendo la pregunta No estoy seguro de si está buscando pasar variables o no; si no lo está, simplemente puede enviar la solicitud fopen contactando http://example.com/filename.xml - siéntase libre ignorar la variable = valor parte

Zxaos
fuente
5

Me gusta usar fsockopen open para esto.

Pbreitenbach
fuente
5

Por otro lado, el uso de REST API de otros servidores es muy popular en PHP. Supongamos que está buscando una manera de redirigir algunas solicitudes HTTP al otro servidor (por ejemplo, obtener un archivo xml). Aquí hay un paquete PHP para ayudarlo:

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

Entonces, obteniendo el archivo xml:

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

Guzzle es una biblioteca muy conocida que hace que sea extremadamente fácil hacer todo tipo de llamadas HTTP. Ver https://github.com/guzzle/guzzle . Instalar con composer require guzzlehttp/guzzley ejecutar composer install. Ahora el código a continuación es suficiente para una llamada http get.

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

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