Установить код состояния ответа

У меня есть вызов API, для которого мне нужно иметь возможность запускать некоторые проверки и, возможно, возвращать различные коды состояния. Мне не нужны пользовательские представления или что-то еще, мне просто нужно вернуть правильный код. Если пользователь не передал надлежащие учетные данные, мне нужно вернуть статус 401. Если они не отправили поддерживаемый формат запроса, мне нужно вернуть статус 400.

Поскольку это API, все, что я действительно хочу сделать, это установить статус ответа и выйти с простым, глупым сообщением о том, почему запрос не удалось (возможно, с помощью exit). Достаточно того, чтобы выполнить эту работу, но я не смог заставить ее работать правильно. Я пробовал использовать PHP header() и Cake $this->header() (все это в контроллере), но хотя я получаю сообщение о выходе, заголовок показывает статус 200 OK.

Используя следующий код, я получаю сообщение, но заголовок не установлен. Что мне не хватает?

  if( !$this->auth_api() ) {
    header( '401 Not Authorized' );
    exit( 'Not authorized' );
  }

Ответ 1

PHP <= 5.3

Функция header() имеет параметр для кода состояния. Если вы укажете его, сервер позаботится об этом оттуда.

header('HTTP/1.1 401 Unauthorized', true, 401);

PHP >= 5.4

См. ответ Гаюса: fooobar.com/questions/69754/...

Ответ 2

С PHP 5.4 вы можете использовать http_response_code.

http_response_code(404);

Это позаботится о настройке правильных заголовков HTTP.

Если вы используете PHP < 5.4, ​​то у вас есть два варианта:

Ответ 3

Я не думаю, что вы правильно устанавливаете header, попробуйте следующее:

header('HTTP/1.0 401 Unauthorized');

Ответ 4

Почему бы не использовать Cakes Response Class? Вы можете установить код состояния ответа просто следующим образом:

$this->response->statusCode(200);

Затем просто визуализируйте файл с сообщением об ошибке, которое лучше всего подходит для JSON.

Ответ 5

У меня была та же проблема с CakePHP 2.0.1

Я попытался использовать

header( 'HTTP/1.1 400 BAD REQUEST' );

и

$this->header( 'HTTP/1.1 400 BAD REQUEST' );

Однако ни одна из них не решила мою проблему.

В конечном итоге я разрешил его с помощью

$this->header( 'HTTP/1.1 400: BAD REQUEST' );

После этого нет ошибок или предупреждений от php/CakePHP.

* edit: В последнем вызове функции $this->header я помещаю двоеточие (:) между 400 и текстом описания ошибки.

Ответ 6

Как написано ранее, но для начинающих, подобных мне, не забудьте включить возврат.

$this->response->statusCode(200);
return $this->response;