Pavel Nakonechnyy

Как сделать http-запрос в PHP

Опубликовано by Pavel Nakonechnyy on (изменено: ) в Web development.

В какой-то момент времени все начинающие php разработчики сталкиваются с необходимостью сделать один или несколько php запросов в их приложении.

В php это делается с помощью библиотеки curl, которая является обёрткой над утилитой curl, которую вы можете найти под любую OC.

Для тех, кто не любит читать, а хочет разобраться сам, сразу приведу полный фрагмент кода с функцией, которую я использую для http запросов к различным API в своих проектах:

<?php
function request($method, $url, $requestbody = null)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if (strtolower($method) == "post") {
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json"
        ));

        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestbody));
    }

    $data = curl_exec($ch);
    curl_close($ch);

    if (isset($data)) {
        return json_decode($data);
    }

    return null;
}

Так как это универсальная функция, в качестве аргументов в неё передается $method — строка с названием http метода (GET, POST и многие другие), $url — URL запрашиваемой страницы и опциональный аргумент $requestbody, который потребуется нам для передачи body с POST запросами (туда мы передадим ассоциативный массив).

    $ch = curl_init();

Этим мы инициализируем пока пустой запрос curl, в который мы будем по очереди загружать различные опции через функцию curl_setopt, со всеми доступными опциями вы можете ознакомиться в справке php, я же расскажу только про используемые здесь.

    curl_setopt($ch, CURLOPT_URL, $url);

Здесь мы передаем URL будущего запроса.

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Без этой опции запрос не вернёт нам ответ сервера, а только успешность этого запроса (в виде true или false), поэтому мы ставим флаг true, т.к. в большинстве случаев нам важно содержимое ответа.

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Будет ли запрос следовать переадресации с использованием 301 Redirects. Чтобы не заморачиваться, ставим true, хотя это может иногда сыграть злую шутку.

Далее мы проверяем какой вид http запроса мы хотим сделать, если это POST запрос, то мы говорим об этом curl и передаем body запроса.

if (strtolower($method) == "post") {
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json"
        ));

        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($requestbody));
    }

Здесь же мы задаем заголовок Content-Type, в большинстве API в body ожидается именно application/json.

$data = curl_exec($ch);
curl_close($ch);

if (isset($data)) {
    return json_decode($data);
}

return null;

Непосредственно осуществляем запрос, записывая результат в $data, закрываем его (освобождая ресурсы сервера) и возвращаем расшифрованный json, если ответ был получен.

Вот таким довольно лёгким способом вы можете делать http-запросы в php. Напоследок, приведу пример тела запроса, чтобы ни у кого не возникало вопросов.

$requestbody = [
    "filter" => [
        "url" => $url,
    ],
    "fields" => [
        "title" => 1,
        "date" => 1,
        "content" => 1,
        "description" => 1,
        "image" => 1,
        "nextlink" => 1,
        "prevlink" => 1,
        "customhomepage" => 1,
        "tags" => 1
    ]
];
416