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

«Какой HTTP-ответ обычно возвращается при успешной отправке запроса?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При успешной обработке запроса сервер возвращает статус-код из класса 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, так как он помогает клиенту понять результат операции без необходимости парсинга тела ответа.