Come inviare una richiesta GET da PHP?


280

Sto pensando di usare PHP per un semplice requisito. Devo scaricare un contenuto XML da un URL, per il quale devo inviare una richiesta HTTP GET a tale URL.

Come lo faccio in PHP?

Risposte:


379

A meno che tu non abbia bisogno di qualcosa di più del semplice contenuto del file, potresti usarlo file_get_contents.

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

Per qualcosa di più complesso, userei cURL .


3
Ciò è corretto, a meno che non sia necessario utilizzare i parametri della stringa di query.
Raptor,

2
@musicfreak: la stringa di query viene talvolta ignorata da alcuni server per le impostazioni di sicurezza. inoltre, la query tra server potrebbe causare questo errore:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor: non sono sicuro di cosa tu stia parlando ... La stringa di query fa solo parte della stringa. Non c'è motivo per cui un server lo ignori. Ora, ovviamente, file_get_contentsnon ti consente di effettuare la richiesta con cookie personalizzati, intestazioni e altre cose che un browser in genere invierebbe, quindi potresti non ottenere la risposta che stavi cercando. In tal caso, sarebbe meglio usare CURL comunque. (Ma questo non è il caso del PO.)
Sasha Chedygov il

1
L'arricciatura è molto più veloce di file_get_contents. Preferisci Curl su file_get_contents in un ambiente ad alto traffico
Deb

2
@Sasha - L'ho affrontato in molti ambienti di produzione ma per ora potresti vedere questi link: haltiko.blogspot.com/2013/02/… o mdb9.wordpress.com/2011/03/06/…
Deb

132

Per richieste GET / POST più avanzate, è possibile installare la libreria 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
Sebbene in realtà non sia necessario utilizzare CURL per un "requisito semplice", +1, perché è davvero la soluzione migliore per fare qualcosa di più avanzato con le richieste HTTP in PHP.
xyz,

Come già accennato, il ricciolo è molto più veloce di file_get_contents(). Una semplice stringa di 4 lettere impiegava circa 10 secondi, mentre l'arricciatura impiegava un ragionevole più di ~ 1 secondo max.
Peter Gordon,

@pgmann Sei sicuro di questo risultato? questo non è in linea con altre statistiche con quanto citato. In effetti, CURL è più veloce, ma non dovrebbe essere molto più veloce. Forse questo calo dei tempi di risposta è arrivato dalla memorizzazione nella cache sul lato server di alcune risorse, ecc.? Forse dovresti ripetere il test?
Rauni Lillemets,

1
@Rauni Temo di non poter ripetere il test ma vado sempre con cURL per l'aumento della velocità, ecc. I tempi di richiesta sono approssimativi, come ci si sente quando si carica la pagina. Ci ho provato più volte.
Peter Gordon,

63

http_getdovrebbe fare il trucco. I vantaggi di http_getover file_get_contentsincludono la possibilità di visualizzare le intestazioni HTTP, accedere ai dettagli della richiesta e controllare il timeout della connessione.

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

83
L'estensione http non è fornita in bundle con PHP e spesso non è disponibile negli host condivisi.
Imran,

27
questo richiede pecl_http> = 0.1.0, che non è installato di default.
Raptor,

5
"La pagina di manuale che stai cercando ( us2.php.net/manual/en/function.http-get.php ) non è al momento disponibile su questo server."
Pang

20

Ricorda che se stai usando un proxy devi fare un piccolo trucco nel tuo codice 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

A seconda che la tua configurazione php consenta di inserire gli URL, puoi anche semplicemente aprire l'URL con gli argomenti get nella stringa (come http://example.com?variable=value )

Modifica: rileggere la domanda Non sono sicuro se stai cercando di passare variabili o no - in caso contrario puoi semplicemente inviare la richiesta fopen contenente http://example.com/filename.xml - sentiti libero per ignorare la parte variabile = valore



5

D'altra parte, l'utilizzo dell'API REST di altri server è molto popolare in PHP. Supponiamo che tu stia cercando un modo per reindirizzare alcune richieste HTTP nell'altro server (ad esempio ottenere un file XML). Ecco un pacchetto PHP per aiutarti:

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

Quindi, ottenendo il file xml:

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

5

Guzzle è una libreria molto nota che rende estremamente facile eseguire tutti i tipi di chiamate HTTP. Vedi https://github.com/guzzle/guzzle . Installa con composer require guzzlehttp/guzzleed esegui composer install. Ora il codice qui sotto è sufficiente per una chiamata get http.

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

echo $response->getStatusCode();
echo $response->getBody();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.