У меня есть вызов API, для которого мне нужно иметь возможность запускать некоторые проверки и потенциально возвращать различные коды состояния. Мне не нужны пользовательские представления или что-то еще, мне просто нужно вернуть правильный код. Если пользователь не передал надлежащие учетные данные, мне нужно вернуть статус 401. Если они не отправили поддерживаемый формат запроса, мне нужно вернуть статус 400.
Поскольку это API, все, что я действительно хочу сделать, это установить статус ответа и выйти с простым, глупым сообщением о том, почему запрос не удался (возможно, с помощью exit
). Достаточно того, чтобы выполнить эту работу, но я не смог заставить ее работать правильно. Я пробовал использовать PHP header()
и Cake's this this this $this->header()
(все это в контроллере), но, хотя я получаю сообщение о выходе, заголовок показывает состояние 200 OK
.
Используя приведенный ниже код, я получаю сообщение, но заголовок не установлен. Что мне не хватает?
if( !$this->auth_api() ) { header( '401 Not Authorized' ); exit( 'Not authorized' ); }
Функция header()
имеет параметр для кода состояния. Если вы укажете его, сервер позаботится об этом оттуда.
header('HTTP/1.1 401 Unauthorized', true, 401);
См. Ответ Гаюса: https://stackoverflow.com/a/14223222/362536
Начиная с PHP 5.4 вы можете использовать http_response_code .
http_response_code(404);
Это позаботится о настройке правильных заголовков HTTP.
Если вы используете PHP <5.4, то у вас есть два варианта:
http_response_code
реализованную в PHP. Я не думаю, что вы правильно настраиваете заголовок , попробуйте следующее:
header('HTTP/1.0 401 Unauthorized');
Почему бы не использовать класс ответов на торты? Вы можете установить код состояния ответа просто следующим образом:
$this->response->statusCode(200);
Затем просто отрисуйте файл с сообщением об ошибке, которое лучше всего подходит для JSON.
У меня была такая же проблема с 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 и текстом описания ошибки.
Как написано ранее, но для начинающих, как я, не забудьте включить возвращение.
$this->response->statusCode(200); return $this->response;