Як надіслати запит GET від PHP?


280

Я планую використовувати PHP для простої вимоги. Мені потрібно завантажити вміст XML з URL-адреси, для якої мені потрібно надіслати HTTP GET-запит на цю URL-адресу.

Як це зробити в PHP?

Відповіді:


378

Якщо вам не потрібен більше, ніж лише вміст файлу, ви могли б використовувати file_get_contents.

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

Для чого-небудь більш складного, я б використовував CURL .


3
Це правильно, якщо вам не потрібно використовувати параметри рядка запиту.
Раптор

2
@musicfreak: рядок запиту іноді ігнорується деякими серверами для налаштувань безпеки. також, крос-серверний запит може призвести до цієї помилки:failed to open stream: HTTP request failed!
Raptor

26
@ShivanRaptor: Я не впевнений, про що ви говорите ... Рядок запиту - це лише частина рядка. Немає причини сервер не ігнорувати це. Тепер, очевидно, file_get_contentsне дозволяє вам робити запит за допомогою спеціальних файлів cookie, заголовків та інших речей, які браузер зазвичай надсилає, тому ви, можливо, не отримаєте потрібної відповіді. У такому випадку вам краще все-таки використовувати CURL. (Але це не справа ОП.)
Саша Чедигов

1
Curl набагато швидше, ніж file_get_contents. Віддає перевагу Curl над file_get_contents в умовах високого трафіку
Деб

2
@Sasha - Я стикався з цим у багатьох виробничих середовищах, але ви можете побачити ці посилання зараз: haltiko.blogspot.com/2013/02/… або mdb9.wordpress.com/2011/03/06/…
Deb

132

Для більш досконалих запитів GET / POST можна встановити бібліотеку 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
Хоча насправді немає потреби використовувати CURL для "простої вимоги", +1, оскільки це дійсно найкраще рішення для того, щоб робити що-небудь більш просунуте з HTTP-запитами в PHP.
xyz

Як вже було сказано, завити набагато швидше, ніж file_get_contents(). Простий рядок з 4 літер займав близько 10 секунд, тоді як завитка займала більше 1 секунди.
Пітер Гордон

@pgmann Ви впевнені в цьому? це не відповідає іншій статистиці з цитованими. Дійсно, CURL швидше, але це не повинно бути набагато швидшим. Можливо, цей спад часу відгуку відбувся через кешування на якомусь сервері якогось ресурсу тощо? Можливо, вам слід повторити тест?
Рауні Ліллемець,

1
@Rauni Боюся, що я не можу повторно протестувати, але я завжди йду з курсом для збільшення швидкості і т. Д. Час запиту приблизний, як це відчувалося під час завантаження сторінки. Я намагався кілька разів.
Пітер Гордон

63

http_getповинен зробити трюк. До переваг http_getпонад file_get_contentsможна віднести можливість перегляду заголовків HTTP, деталізації запиту доступу та контролю затримки з'єднання.

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

83
Розширення http не входить у комплект із PHP і часто не доступне для спільних хостів.
Імран

27
для цього потрібен pecl_http> = 0.1.0, який не встановлений за замовчуванням.
Раптор

5
"Сторінка керівництва, яку ви шукаєте ( us2.php.net/manual/en/function.http-get.php ), наразі недоступна на цьому сервері."
Панг

20

Пам’ятайте, що якщо ви використовуєте проксі, вам потрібно зробити невеликий трюк у вашому 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

Залежно від того, чи дозволяє ваша програма php розгорнути URL-адреси, ви також можете просто відбити URL-адресу з аргументами get в рядку (наприклад, http://example.com?variable=value )

Редагувати: Перечитавши запитання. Я не впевнений, ви хочете передати змінні чи ні - якщо ви не можете, ви можете просто надіслати запит fopen, звернувшись до http://example.com/filename.xml - не соромтеся ігнорувати змінну = значення частини



5

З іншого боку, використання REST API інших серверів користується великою популярністю в PHP. Припустимо, ви шукаєте спосіб перенаправити деякі HTTP-запити на інший сервер (наприклад, отримати XML-файл). Ось пакет PHP, який допоможе вам:

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

Отже, отримання файлу xml:

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

5

Guzzle - це дуже відома бібліотека, яка дозволяє надзвичайно легко робити всілякі дзвінки HTTP. Дивіться https://github.com/guzzle/guzzle . Встановіть composer require guzzlehttp/guzzleі запустіть composer install. Тепер коду нижче достатньо для отримання дзвінка на http.

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

echo $response->getStatusCode();
echo $response->getBody();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.