Jak wysłać żądanie GET z PHP?

280

Planuję używać PHP do prostych wymagań. Muszę pobrać treść XML z adresu URL, dla którego muszę wysłać żądanie HTTP GET na ten adres URL.

Jak to zrobić w PHP?

Veera
źródło

Odpowiedzi:

378

O ile nie potrzebujesz więcej niż tylko zawartości pliku, możesz użyć file_get_contents.

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

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

Sasha Chedygov
źródło
3
Jest to poprawne, chyba że musisz użyć parametrów ciągu zapytania.
Raptor,
2
@musicfreak: ciąg zapytania jest czasami ignorowany przez niektóre serwery ze względu na ustawienia bezpieczeństwa. również zapytanie między serwerami może powodować ten błąd:failed to open stream: HTTP request failed!
Raptor
26
@ShivanRaptor: Nie jestem pewien, o czym mówisz ... Ciąg zapytania jest tylko częścią ciągu. Nie ma powodu, aby serwer to ignorował. Teraz, oczywiście, file_get_contentsnie pozwala ci składać wniosku z niestandardowymi plikami cookie, nagłówkami i innymi rzeczami, które przeglądarka zwykle wysyła, więc możesz nie otrzymać odpowiedzi, której szukasz. W takim przypadku lepiej byłoby użyć CURL. (Ale to nie jest przypadek OP.)
Sasha Chedygov
1
Zwijanie jest o wiele szybsze niż file_get_contents. Wolę Curl niż file_get_contents w środowisku o dużym natężeniu ruchu
Deb
2
@Sasha - Zmierzyłem się z tym w wielu środowiskach produkcyjnych, ale na razie możesz zobaczyć te linki: haltiko.blogspot.com/2013/02/... lub mdb9.wordpress.com/2011/03/06/…
Deb
132

W przypadku bardziej zaawansowanych żądań GET / POST można zainstalować bibliotekę 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);
James Skidmore
źródło
10
Chociaż tak naprawdę nie ma potrzeby używania CURL do „prostych wymagań”, +1, ponieważ jest to naprawdę najlepsze rozwiązanie do robienia czegokolwiek bardziej zaawansowanego z żądaniami HTTP w PHP.
xyz
Jak już wspomniano, zwijanie jest znacznie szybsze niż file_get_contents(). Prosty ciąg 4 liter zajął z nim około 10 sekund, podczas gdy zwijanie trwało bardziej rozsądnie ~ 1 sekundę.
Peter Gordon,
@pgmann Czy jesteś pewien, że w tym wyniku? nie jest to zgodne z innymi statystykami z tym, co zostało zacytowane. Rzeczywiście, CURL jest szybszy, ale nie powinien być o wiele szybszy. Może ten spadek czasu odpowiedzi wynikał z buforowania niektórych zasobów po stronie serwera itp.? Może powinieneś powtórzyć test?
Rauni Lillemets,
1
@Rauni Obawiam się, że nie mogę ponownie przetestować, ale zawsze używam cURL do zwiększenia prędkości itp. Czasy żądań są przybliżone, jak to było podczas ładowania strony. Próbowałem wiele razy.
Peter Gordon,
63

http_getpowinien załatwić sprawę. Zalety http_getover file_get_contentsobejmują możliwość przeglądania nagłówków HTTP, szczegółów żądań dostępu i kontroli limitu czasu połączenia.

$response = http_get("http://www.example.com/file.xml");
William Brendel
źródło
83
Rozszerzenie http nie jest dołączane do PHP i często niedostępne na hostach współdzielonych.
Imran
27
wymaga to pecl_http> = 0.1.0, który nie jest domyślnie instalowany.
Raptor,
5
„Strona, której szukasz ( us2.php.net/manual/en/function.http-get.php ) nie jest obecnie dostępna na tym serwerze.”
Pang
20

Pamiętaj, że jeśli używasz proxy, musisz 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;
?>
Pepe
źródło
9

W zależności od tego, czy konfiguracja php zezwala na otwieranie adresów URL, możesz również po prostu otworzyć adres URL za pomocą argumentów get w ciągu (np. Http://example.com?variable=value )

Edycja: Ponownie przeczytaj pytanie Nie jestem pewien, czy chcesz przekazać zmienne, czy nie - jeśli nie, możesz po prostu wysłać żądanie otwarcia zawierające http://example.com/filename.xml - nie krępuj się zignorować część zmienna = wartość

Zxaos
źródło
5

Lubię używać do tego fsockopen.

pbreitenbach
źródło
5

Z drugiej strony, używanie REST API innych serwerów jest bardzo popularne w PHP. Załóżmy, że szukasz sposobu przekierowania niektórych żądań HTTP na inny serwer (na przykład uzyskanie pliku xml). Oto pakiet PHP, który Ci pomoże:

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

Pobieranie pliku XML:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();
Mostafa
źródło
5

Guzzle jest bardzo dobrze znaną biblioteką, która sprawia, że ​​niezwykle łatwe jest wykonywanie wszelkiego rodzaju połączeń HTTP. Zobacz https://github.com/guzzle/guzzle . Zainstaluj za pomocą composer require guzzlehttp/guzzlei uruchom composer install. Teraz poniższy kod wystarczy, aby uzyskać połączenie http.

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

echo $response->getStatusCode();
echo $response->getBody();
Mark Baaijens
źródło