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?

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 .


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);

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");

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;
?>

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ść



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();

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.