Как отправить POST-запрос с помощью PHP?
Я хочу получить содержимое, которое появляется после выполнения поискового запроса. Проблема в том, что URL принимает только методы POST
и не реагирует на GET
запросы.
Мне нужно прочитать все содержимое с помощью domdocument
или file_get_contents()
. Существует ли какой-либо способ отправить параметры с помощью метода POST
, а затем получить содержимое с помощью PHP
?
5 ответ(ов)
Для выполнения HTTP-запроса без использования cURL в PHP можно воспользоваться функцией file_get_contents
с контекстом потока. Вот пример кода, который отправляет POST-запрос с данными на сервер:
$url = 'http://server.com/path';
$data = ['key1' => 'value1', 'key2' => 'value2'];
// Используем ключ 'http', даже если запрос отправляется на https://...
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
],
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === false) {
/* Обработка ошибки */
}
var_dump($result);
В этом примере:
- Мы создаем массив с данными, которые хотим отправить на сервер.
- Определяем настройки контекста, где указываем тип контента, метод запроса (POST) и содержимое запроса, закодированное с помощью
http_build_query
. - Создаем контекст потока с помощью
stream_context_create
. - Отправляем запрос с помощью
file_get_contents
, передавая контекст как третий аргумент.
Если вы хотите узнать больше о создании потоков и добавлении заголовков, можете ознакомиться с документацией PHP.
Вы используете следующую функцию для отправки данных с помощью cURL. $data
— это массив полей для отправки (он будет правильно закодирован с помощью http_build_query()
).
function httpPost($url, $data)
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
Пользователь @Edward упоминает, что http_build_query()
можно опустить, так как cURL корректно закодирует массив, переданный в параметр CURLOPT_POSTFIELDS
. Это верно, однако имейте в виду, что в этом случае данные будут закодированы с использованием multipart/form-data
, что может быть нежелательно, так как некоторые конечные точки ожидают данные, закодированные с использованием application/x-www-form-urlencoded
. Используя http_build_query()
, как в приведенной выше функции, вы получите кодировку application/x-www-form-urlencoded
.
Существует другой метод CURL, если вы собираетесь этим заниматься.
Это довольно просто, как только вы поймете, как работает расширение PHP curl, сочетая различные флаги с вызовами setopt(). В этом примере у меня есть переменная $xml
, в которой хранится подготовленный XML, который я собираюсь отправить - я собираюсь отправить содержимое этой переменной в тестовый метод примера.
$url = 'http://api.example.com/services/xmlrpc/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// обработка $response
Сначала мы инициализируем соединение, затем устанавливаем некоторые параметры с помощью setopt()
. Эти параметры сообщают PHP, что мы выполняем POST-запрос и что мы отправляем с ним данные, передавая эти данные. Флаг CURLOPT_RETURNTRANSFER
указывает curl вернуть вывод в качестве возвращаемого значения функции curl_exec
, вместо того чтобы выводить его напрямую. Затем мы выполняем вызов и закрываем соединение - результат находится в переменной $response
.
Вы можете использовать всего одну команду без cURL для отправки POST-запроса и получения ответа. Вот простой пример на PHP:
echo file_get_contents('https://www.server.com', false, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded",
'content' => http_build_query([
'key1' => 'Hello world!', 'key2' => 'second value'
])
]
]));
В данном коде мы используем функцию file_get_contents
для отправки данных на сервер по указанному URL. Мы создаем контекст потока с помощью stream_context_create
, в котором указываем параметры POST-запроса, включая заголовок Content-type
и содержимое запроса в формате URL-кодирования с помощью http_build_query
. Такой подход позволяет сделать простые HTTP-запросы без необходимости использования cURL.
Вопрос заключается в том, какой лучший способ отправки GET
или POST
запросов с помощью PHP
. Вот один из подходов, который можно использовать:
<?php
$r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST);
$r->setOptions(array('cookies' => array('lang' => 'de')));
$r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));
try {
echo $r->send()->getBody();
} catch (HttpException $ex) {
echo $ex;
}
?>
В этом примере используется класс HttpRequest
, который позволяет удобно отправлять POST запросы. Вы можете установить куки и передать поля формы с помощью метода addPostFields()
. Также важно обрабатывать возможные исключения, чтобы избежать сбоев в работе приложения.
Код взят из официальной документации здесь.
Как вывести ошибки PHP на экран?
UTF-8 на всех уровнях!
Функции startsWith() и endsWith() в PHP
Что такое потокобезопасность и непотокобезопасность в PHP?
Как получить расширение файла в PHP?