8

Как отправить POST-запрос с помощью PHP?

1

Я хочу получить содержимое, которое появляется после выполнения поискового запроса. Проблема в том, что URL принимает только методы POST и не реагирует на GET запросы.

Мне нужно прочитать все содержимое с помощью domdocument или file_get_contents(). Существует ли какой-либо способ отправить параметры с помощью метода POST, а затем получить содержимое с помощью PHP?

5 ответ(ов)

14

Для выполнения 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);

В этом примере:

  1. Мы создаем массив с данными, которые хотим отправить на сервер.
  2. Определяем настройки контекста, где указываем тип контента, метод запроса (POST) и содержимое запроса, закодированное с помощью http_build_query.
  3. Создаем контекст потока с помощью stream_context_create.
  4. Отправляем запрос с помощью file_get_contents, передавая контекст как третий аргумент.

Если вы хотите узнать больше о создании потоков и добавлении заголовков, можете ознакомиться с документацией PHP.

0

Вы используете следующую функцию для отправки данных с помощью 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.

0

Существует другой метод 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.

0

Вы можете использовать всего одну команду без 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.

0

Вопрос заключается в том, какой лучший способ отправки 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(). Также важно обрабатывать возможные исключения, чтобы избежать сбоев в работе приложения.

Код взят из официальной документации здесь.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь