Avatar ·

Как преобразовать запрос из Postman в PHP cURL код? Подробная инструкция

Всем привет! Я начинающий PHP-разработчик, и у меня возникла проблема. Я активно использую Postman для тестирования API, но когда дело доходит до переноса этих запросов в реальный PHP-код, я каждый раз теряю кучу времени и делаю ошибки.

Вот конкретная ситуация: у меня есть рабочий POST-запрос в Postman к внешнему сервису. Запрос содержит:

  • URL: https://api.example.com/v2/users
  • Headers: Authorization: Bearer token123, Content-Type: application/json
  • Body (raw JSON): {"name": "Иван", "email": "ivan@example.com", "role": "admin"}

В Postman всё работает идеально — приходит ответ 201 Created с данными нового пользователя. Но когда я пытаюсь написать PHP-код с использованием cURL, у меня ничего не выходит. Сервер возвращает ошибку 400 Bad Request или просто пустой ответ.

Вот мой текущий код, который не работает:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/v2/users");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"name": "Иван", "email": "ivan@example.com", "role": "admin"}');
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

Я понимаю, что что-то упускаю с заголовками или настройками cURL. Подскажите, как правильно конвертировать запрос из Postman в PHP cURL? Может быть, есть автоматический способ или чек-лист того, что нужно обязательно проверить?

Заранее спасибо за помощь!

<<>>

Как правильно преобразовать Postman запрос в PHP cURL: полное руководство

Проблема, с которой вы столкнулись, очень распространена среди разработчиков. Postman автоматически добавляет множество заголовков и настроек, которые в PHP нужно указывать явно. Давайте разберем пошаговое решение.

1. Используйте встроенную функцию Postman "Generate Code"

Самый простой способ — не писать код вручную, а воспользоваться автоматической генерацией. В Postman:

  • Нажмите кнопку "Code" (справа, под кнопкой Send)
  • В открывшемся окне выберите "PHP - cURL" из списка языков
  • Скопируйте готовый код

Однако сгенерированный код часто бывает избыточным. Вот оптимизированная версия для вашего запроса:

<?php
$ch = curl_init();

// 1. URL
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/v2/users");

// 2. Метод POST
curl_setopt($ch, CURLOPT_POST, 1);

// 3. Тело запроса (JSON)
$data = json_encode([
    "name" => "Иван",
    "email" => "ivan@example.com",
    "role" => "admin"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// 4. Заголовки (самое важное!)
$headers = [
    "Authorization: Bearer token123",
    "Content-Type: application/json",
    "Accept: application/json"  // часто забывают
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// 5. Возвращать результат вместо вывода
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 6. Отключаем проверку SSL (только для тестов!)
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

// Проверка на ошибки
if (curl_errno($ch)) {
    echo 'cURL error: ' . curl_error($ch);
} else {
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "HTTP Status: $http_code\n";
    echo $response;
}

curl_close($ch);
?>

2. Ключевые моменты, которые вы упустили

  • CURLOPT_HTTPHEADER — вы не передавали заголовки вообще! Без них сервер не знает, что вы шлете JSON и кто вы.
  • CURLOPT_RETURNTRANSFER — без этого параметра curl_exec() выводит результат сразу, а не возвращает его в переменную.
  • Content-Type: application/json — критически важен для POST-запросов с JSON.
  • Кодировка данных — используйте json_encode() для создания JSON из массива PHP, это безопаснее и читаемее.

3. Универсальная функция для конвертации

Вот функция, которая принимает параметры как в Postman и выполняет запрос:

<?php
function postmanToCurl($url, $method = 'GET', $headers = [], $body = null) {
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    
    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, true);
        if ($body) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        }
    } elseif ($method === 'PUT') {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        if ($body) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        }
    } elseif ($method === 'DELETE') {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
    }
    
    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    
    curl_close($ch);
    
    return [
        'http_code' => $httpCode,
        'response' => $response,
        'error' => $error
    ];
}

// Использование:
$result = postmanToCurl(
    'https://api.example.com/v2/users',
    'POST',
    [
        'Authorization: Bearer token123',
        'Content-Type: application/json',
        'Accept: application/json'
    ],
    json_encode(['name' => 'Иван', 'email' => 'ivan@example.com', 'role' => 'admin'])
);

print_r($result);
?>

4. Чек-лист для отладки

  1. Всегда проверяйте curl_error() после выполнения
  2. Смотрите HTTP-код ответа через curl_getinfo($ch, CURLINFO_HTTP_CODE)
  3. Временно включите CURLOPT_VERBOSE для полного лога запроса
  4. Сравните заголовки в Postman (вкладка Headers) и в вашем коде — они должны совпадать
  5. Если используете HTTPS, проверьте SSL-сертификаты или временно отключите проверку для тестов

После применения этих правок ваш запрос должен работать так же, как в Postman. Удачи!

<<>>

Альтернативный подход: используйте Guzzle вместо чистого cURL

Если вы часто работаете с API и устали вручную настраивать cURL, рекомендую перейти на библиотеку GuzzleHttp. Она значительно упрощает работу с HTTP-запросами и делает код чище.

Установка через Composer:

composer require guzzlehttp/guzzle

Ваш запрос с Guzzle будет выглядеть так:

<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.example.com',
    'headers' => [
        'Authorization' => 'Bearer token123',
        'Accept' => 'application/json',
    ]
]);

try {
    $response = $client->post('/v2/users', [
        'json' => [
            'name' => 'Иван',
            'email' => 'ivan@example.com',
            'role' => 'admin'
        ]
    ]);
    
    echo $response->getStatusCode(); // 201
    $data = json_decode($response->getBody(), true);
    print_r($data);
    
} catch (\GuzzleHttp\Exception\ClientException $e) {
    echo "Ошибка: " . $e->getMessage();
    echo "Ответ сервера: " . $e->getResponse()->getBody();
}
?>

Преимущества Guzzle:

  • Автоматическая сериализация — опция 'json' сама преобразует массив в JSON и устанавливает заголовок Content-Type
  • Обработка ошибок — исключения для 4xx и 5xx ответов
  • Пул соединений — переиспользование соединений для нескольких запросов
  • Middleware — легко добавить логирование, ретраи, кэширование

Если ваш проект использует современные практики (PSR-7, P