2009-06-06 15 views
219

Mam zamiar użyć PHP na proste wymaganie. Muszę pobrać zawartość XML z adresu URL, do którego muszę wysłać żądanie HTTP GET do tego adresu URL.Jak wysłać żądanie GET z PHP?

Jak to zrobić w PHP?

Odpowiedz

294

ile trzeba więcej niż tylko zawartość pliku, można użyć file_get_contents.

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

Dla czegoś bardziej złożonego użyłbym cURL.

+3

Jest to poprawne, chyba że musisz użyć parametrów ciągu zapytania. – Raptor

+1

@musicfreak: ciąg zapytania jest czasami ignorowany przez niektóre serwery w celu ustawienia zabezpieczeń. również zapytanie na różnych serwerach może spowodować ten błąd: 'nie udało się otworzyć strumienia: żądanie HTTP nie powiodło się!' – Raptor

+25

@ShivanRaptor: Nie jestem pewien, o czym mówisz ... Ciąg zapytania jest po prostu częścią ciągu . Nie ma powodu, dla którego serwer zignorowałby to. Oczywiście, 'file_get_contents' nie pozwala ci na tworzenie niestandardowych plików cookie, nagłówków i innych rzeczy, które zazwyczaj wysyła przeglądarka, więc możesz nie otrzymać odpowiedzi, której szukasz. W takim przypadku najlepiej byłoby użyć CURL. (Ale to nie jest przypadek PO). –

55

http_get powinien załatwić sprawę. Zalety usługi http_get przez file_get_contents obejmują możliwość wyświetlania nagłówków HTTP, szczegółów żądania dostępu i kontrolowania limitu czasu połączenia.

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

rozszerzenie http nie jest dołączane do PHP i często nie jest dostępny we wspólnych gospodarzy. – Imran

+25

wymaga to pecl_http> = 0.1.0, który nie jest domyślnie instalowany. – Raptor

111

Dla bardziej zaawansowanych żądań GET/POST, można zainstalować biblioteki 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

Chociaż tak naprawdę nie ma potrzeby używania CURL do "prostego wymogu", +1 , ponieważ jest to naprawdę najlepsze rozwiązanie do robienia czegoś bardziej zaawansowanego z żądaniami HTTP w PHP. – xyz

+0

Jak już wspomniano, curl jest znacznie szybszy niż 'file_get_contents()'. Prosty 4-literowy ciąg trwał około 10 sekund, natomiast curl trwał rozsądniej ~ 1 sekundę maksimum. –

+0

@pgmann jesteś pewien w tym wyniku? nie jest to zgodne z innymi statystykami z cytowanymi danymi. Rzeczywiście, CURL jest szybszy, ale nie powinien być znacznie szybszy. Może ten spadek czasu odpowiedzi pochodzi z buforowania po stronie serwera jakiegoś zasobu itp.? Może powinieneś powtórzyć test? –

8

W zależności od tego, czy konfiguracja php pozwala fopen na adresach URL, można też po prostu fopen url z GET Argumenty w ciągu znaków (np.)

Edycja: Ponowne czytanie pytania Nie jestem pewien, czy chcesz przekazać zmienne, czy nie - jeśli nie możesz, możesz po prostu wysłać prośbę fopen zawierającą http://example.com/filename.xml - możesz zignorować zmienną = wartość część

17

Pamiętaj, że jeśli używasz proxy trzeba zrobić małą sztuczkę w kodzie 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

W drugiej strony, za pomocą REST API z innych serwerów są bardzo popularne w PHP. Załóżmy, że szukasz sposobu przekierowania niektórych żądań HTTP na inny serwer (na przykład pobranie pliku xml). Oto pakiet PHP pomóc:

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

Więc coraz plik XML:

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