¿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?

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 .


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

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

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

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



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();

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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.