Comment envoyer une demande GET depuis PHP?


280

Je prévois d'utiliser PHP pour une simple exigence. Je dois télécharger un contenu XML à partir d'une URL, pour laquelle je dois envoyer une demande HTTP GET à cette URL.

Comment faire en PHP?

Réponses:


379

Sauf si vous avez besoin de plus que le contenu du fichier, vous pouvez l'utiliser file_get_contents.

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

Pour quelque chose de plus complexe, j'utiliserais cURL .


3
C'est correct, sauf si vous devez utiliser des paramètres de chaîne de requête.
Raptor

2
@musicfreak: la chaîne de requête est parfois ignorée par certains serveurs pour les paramètres de sécurité. également, une requête interserveur peut entraîner cette erreur:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor: Je ne sais pas de quoi vous parlez ... La chaîne de requête n'est qu'une partie de la chaîne. Il n'y a aucune raison qu'un serveur l'ignore. Maintenant, évidemment, file_get_contentsne vous permet pas de faire la demande avec des cookies personnalisés, des en-têtes et d'autres choses qu'un navigateur enverrait généralement, donc vous pourriez ne pas obtenir la réponse que vous recherchez. Dans ce cas, vous feriez mieux d'utiliser CURL de toute façon. (Mais ce n'est pas le cas du PO.)
Sasha Chedygov

1
Curl est beaucoup plus rapide que file_get_contents. Préférez Curl sur file_get_contents dans un environnement à fort trafic
Deb

2
@Sasha - J'ai rencontré ce problème dans de nombreux environnements de production, mais vous pouvez voir ces liens pour l'instant: haltiko.blogspot.com/2013/02/… ou mdb9.wordpress.com/2011/03/06/…
Deb

132

Pour des demandes GET / POST plus avancées, vous pouvez installer la bibliothèque 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
Bien qu'il n'y ait vraiment pas besoin d'utiliser CURL pour une "simple exigence", +1, car c'est vraiment la meilleure solution pour faire quelque chose de plus avancé avec les requêtes HTTP en PHP.
xyz

Comme déjà mentionné, curl est beaucoup plus rapide que file_get_contents(). Une simple chaîne de 4 lettres a pris environ 10 secondes, tandis que la boucle a pris plus de 1 seconde max.
Peter Gordon

@pgmann êtes-vous sûr de ce résultat? ce n'est pas conforme à d'autres statistiques avec ce qui a été cité. En effet, CURL est plus rapide, mais il ne devrait pas l'être beaucoup plus rapidement. Peut-être que cette baisse du temps de réponse est venue de la mise en cache côté serveur de certaines ressources, etc.? Vous devriez peut-être répéter le test?
Rauni Lillemets

1
@Rauni Je crains de ne pas pouvoir retester, mais je choisis toujours cURL pour l'augmentation de la vitesse, etc. Les délais de demande sont approximatifs, ce que j'ai ressenti lors du chargement de la page. J'ai essayé plusieurs fois.
Peter Gordon

63

http_getdevrait faire l'affaire. Les avantages de http_getover file_get_contentsincluent la possibilité d'afficher les en-têtes HTTP, d'accéder aux détails de la demande et de contrôler le délai d'expiration de la connexion.

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

83
L'extension http n'est pas fournie avec PHP et n'est souvent pas disponible dans les hôtes partagés.
Imran

27
cela nécessite pecl_http> = 0.1.0, qui n'est pas installé par défaut.
Raptor

5
"La page de manuel que vous recherchez ( us2.php.net/manual/en/function.http-get.php ) n'est pas disponible sur ce serveur pour le moment."
Pang

20

N'oubliez pas que si vous utilisez un proxy, vous devez faire une petite astuce dans votre code 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

Selon que votre configuration php autorise fopen sur les URL, vous pouvez également fopen simplement l'url avec les arguments get dans la chaîne (comme http://example.com?variable=value )

Edit: relisant la question, je ne suis pas certain si vous cherchez à passer des variables ou non - si vous ne l'êtes pas, vous pouvez simplement envoyer la demande fopen contenant http://example.com/filename.xml - n'hésitez pas ignorer la partie variable = valeur



5

En revanche, l'utilisation de l'API REST d'autres serveurs est très populaire en PHP. Supposons que vous cherchiez un moyen de rediriger certaines requêtes HTTP vers l'autre serveur (par exemple, obtenir un fichier xml). Voici un package PHP pour vous aider:

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

Donc, obtenir le fichier xml:

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

5

Guzzle est une bibliothèque très connue qui rend extrêmement facile de faire toutes sortes d'appels HTTP. Voir https://github.com/guzzle/guzzle . Installez avec composer require guzzlehttp/guzzleet exécutez composer install. Le code ci-dessous est maintenant suffisant pour un appel http get.

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

echo $response->getStatusCode();
echo $response->getBody();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.