Какой HTTP-ответ обычно возвращается при успешной отправке запроса?

Ответ

При успешной обработке запроса сервер возвращает статус-код из класса 2xx (Success). Конкретный код зависит от типа операции и соглашений API:

  • 200 OK — самый распространенный ответ. Запрос успешно обработан, и тело ответа содержит запрошенные данные (например, результат GET-запроса или результат выполнения операции).
  • 201 Created — указывает, что новый ресурс был успешно создан в результате запроса (обычно POST). В заголовке Location должен быть указан URI созданного ресурса.

    // Пример ответа в Symfony контроллере после создания пользователя
    public function createUser(Request $request): JsonResponse
    {
        $user = new User($request->get('email'));
        $this->entityManager->persist($user);
        $this->entityManager->flush();
    
        return $this->json(
            ['id' => $user->getId(), 'email' => $user->getEmail()],
            Response::HTTP_CREATED, // 201
            ['Location' => '/api/users/' . $user->getId()]
        );
    }
  • 204 No Content — сервер успешно выполнил запрос, но не возвращает никакого содержимого в теле ответа. Часто используется для операций DELETE или PUT, когда нужно просто подтвердить успех.
  • 202 Accepted — запрос принят на обработку, но она еще не завершена (асинхронные задачи).
  • 206 Partial Content — сервер возвращает только часть данных (используется для докачки файлов).

Проверка успешного ответа в PHP (с использованием Guzzle HTTP Client):

$client = new GuzzleHttpClient();
$response = $client->post('https://api.example.com/items', [
    'json' => ['name' => 'New Item']
]);

$statusCode = $response->getStatusCode();

if ($statusCode >= 200 && $statusCode < 300) {
    // Запрос успешен
    $body = json_decode($response->getBody(), true);
    echo 'Создан элемент с ID: ' . $body['id'];

    // Можно проверить конкретный код
    if ($statusCode === 201) {
        $newItemUrl = $response->getHeaderLine('Location');
        echo ' Новый ресурс по адресу: ' . $newItemUrl;
    }
} else {
    // Обработка ошибки
    throw new Exception('Запрос не удался: ' . $statusCode);
}

Выбор конкретного кода — важная часть дизайна RESTful API, так как он помогает клиенту понять результат операции без необходимости парсинга тела ответа.

Ответ 18+ 🔞

Э, слушай, вот тебе на самом деле важная штука, про которую многие забывают, а потом удивляются, почему у них всё ебется. Когда твой запрос таки долетел до сервера и тот его не послал нахуй, он вернёт статус из семейства 2xx (Success). Но тут, бля, не всё так просто — есть нюансы, ёпта.

  • 200 OK — это классика, как борщ с пампушкой. Всё чётко, запрос отработал, и в теле ответа лежит то, что ты просил. Например, список пользователей после GET-запроса.
  • 201 Created — вот это уже поинтереснее. Это когда ты, сука, что-то создал (обычно POST'ом), и сервер тебе говорит: «Ну всё, чувак, родил ты нового юзера, держи его айдишник». И в заголовках ещё должен быть адрес, где этого новорождённого найти. Без этого — манда с ушами.

    // Допустим, в Symfony ты создал какого-то чела
    public function createUser(Request $request): JsonResponse
    {
        $user = new User($request->get('email'));
        $this->entityManager->persist($user);
        $this->entityManager->flush();
    
        // Вот тут важно не забыть про заголовок Location, а то будет пиздец
        return $this->json(
            ['id' => $user->getId(), 'email' => $user->getEmail()],
            Response::HTTP_CREATED, // Это и есть 201
            ['Location' => '/api/users/' . $user->getId()]
        );
    }
  • 204 No Content — а это когда ты, например, удалил что-то (DELETE) или обновил (PUT), и сервер тебе отвечает: «Да, бля, сделано, но смотреть тут не на что, тело ответа пустое». Типа, доверия ебать ноль, но так и задумано.
  • 202 Accepted — принято, но не готово. Асинхронщина, понимаешь? Запрос взяли в работу, а результат будет позже. Сиди, жди, не дёргайся.
  • 206 Partial Content — это когда ты качаешь порнофильм, а интернет говно, и ты просишь докачать с того места, где оборвалось. Сервер тебе шлёт только кусок данных.

А вот как это проверить на практике, чтобы не облажаться (на примере Guzzle):

$client = new GuzzleHttpClient();
$response = $client->post('https://api.example.com/items', [
    'json' => ['name' => 'New Item']
]);

$statusCode = $response->getStatusCode();

// Главное правило: если код между 200 и 299 — всё пиздато
if ($statusCode >= 200 && $statusCode < 300) {
    // Ура, товарищи!
    $body = json_decode($response->getBody(), true);
    echo 'Создан элемент с ID: ' . $body['id'];

    // А можно и уточнить, что именно за успех
    if ($statusCode === 201) {
        $newItemUrl = $response->getHeaderLine('Location');
        echo ' Новый ресурс по адресу: ' . $newItemUrl;
    }
} else {
    // А вот тут уже начинается ад. Обрабатывай ошибку.
    throw new Exception('Запрос не удался: ' . $statusCode);
}

Короче, выбор правильного статус-кода — это не просто формальность, а часть уважения к тому, кто будет твой API использовать. Иначе получится хитрая жопа, когда по коду 200 прилетает сообщение об ошибке. Так делать — пидарас шерстяной.