2009-06-06 1 views
219

Ho intenzione di utilizzare PHP per un semplice requisito. Devo scaricare un contenuto XML da un URL, per il quale devo inviare la richiesta HTTP GET a quell'URL.Come inviare una richiesta GET da PHP?

Come si fa in PHP?

risposta

294

A meno che non avete bisogno di più che i contenuti del file, è possibile utilizzare file_get_contents.

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

Per qualcosa di più complesso, userei cURL.

+3

Questo è corretto, a meno che non sia necessario utilizzare i parametri della stringa di query. – Raptor

+1

@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: 'impossibile aprire lo stream: richiesta HTTP non riuscita!' – Raptor

+25

@ShivanRaptor: non sono sicuro di cosa stai parlando ... La stringa di query è solo parte della stringa . Non c'è ragione per cui un server lo ignorerebbe. Ora, ovviamente, 'file_get_contents' non ti consente di effettuare la richiesta con cookie, intestazioni e altri elementi personalizzati che un browser invierà, quindi potresti non ottenere la risposta che stavi cercando. In tal caso, starai meglio usando CURL comunque. (Ma quello non è il caso dell'OP.) –

55

http_get dovrebbe fare il trucco. I vantaggi di http_get su file_get_contents includono la possibilità di visualizzare le intestazioni HTTP, i dettagli delle richieste di accesso e controllare il timeout della connessione.

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

estensione http non è in bundle con PHP e spesso non disponibili in host condivisi. – Imran

+25

ciò richiede pecl_http> = 0.1.0, che non è installato per impostazione predefinita. – Raptor

111

per le 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 non ci sia davvero bisogno di usare CURL per un "semplice requisito", +1 , perché è davvero la soluzione migliore per fare qualcosa di più avanzato con le richieste HTTP in PHP. – xyz

+0

Come già accennato, curl è molto più veloce di 'file_get_contents()'. Una semplice stringa di 4 lettere impiegava circa 10 secondi, mentre l'arricciatura richiedeva un valore più ragionevole di ~ 1 secondo massimo. –

+0

@pgmann sei sicuro in quel risultato? questo non è in linea con altre statistiche con quello che è stato citato. In effetti, CURL è più veloce, ma non dovrebbe essere molto più veloce. Forse questo calo del tempo di risposta è venuto dal caching lato server di alcune risorse, ecc.? Forse dovresti ripetere il test? –

8

A seconda se la configurazione di PHP permette fopen su URL, si potrebbe anche semplicemente fopen l'url con get argomenti nella stringa (come http://example.com?variable=value)

Modifica: rilettura della domanda Non sono sicuro se stai cercando di passare variabili o meno - se non lo sei puoi semplicemente inviare la richiesta di fopen contenente http://example.com/filename.xml - Sentiti libero di ignorare la variabile = valore parte

5

Mi piace usare fsockopen aperto per questo.

17

ricordare che se si sta utilizzando un proxy è necessario fare un piccolo trucco nel 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; 
?> 
2

In altra parte, utilizzando API REST di altri server sono molto popolari 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 di PHP per aiutarvi a:

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

Quindi, ottenere il file xml:

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