2011-05-28 20 views
81

Tengo una llamada de API para la que necesito poder ejecutar algunas comprobaciones y devolver varios códigos de estado. No necesito vistas personalizadas ni nada, solo necesito devolver el código correcto. Si el usuario no ha aprobado las credenciales adecuadas, necesito devolver un estado 401. Si no han enviado un formato de solicitud compatible, necesito devolver un estado de 400.Establecer código de estado de respuesta

Como es una API, todo lo que quiero hacer es establecer el estado de la respuesta y salir con un mensaje simple y estúpido sobre por qué la solicitud falló (probablemente usando un exit). Solo lo suficiente para hacer el trabajo, pero no he podido hacer que esto funcione bien. He intentado usar PHP's header() y Cake's $this->header() (todo esto está en el controlador), pero aunque recibo el mensaje de salida, el encabezado muestra un estado 200 OK.

Usando el siguiente código, recibo el mensaje, pero el encabezado no está configurado. ¿Qué me estoy perdiendo?

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

Respuesta

115

PHP < = 5,3

La función header() tiene un parámetro de código de estado. Si lo especifica, el servidor se encargará de eso desde allí.

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

PHP> = 5.4

Ver Gajus' respuesta: https://stackoverflow.com/a/14223222/362536

+1

Interesante. Nunca he visto esto en uso, pero el manual ciertamente está de acuerdo contigo. Esto se siente como un mejor método para mí. –

+0

Digno de una bofetada punitiva. Eché de menos lo obvio en mi prisa por noquearlo. Gracias por ayudarme, chicos. –

+0

Encontré que necesitas poner la descripción del estado en el primer parámetro para que funcione ... –

10

No creo que se está configurando el header correctamente, intente esto:

header('HTTP/1.0 401 Unauthorized'); 
4

Yo tenía el mismo problema con CakePHP 2.0.1

me trató de usar

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

y

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

Sin embargo, ninguno de estos resolvió mi problema.

Yo eventualmente se resuelva mediante el uso de

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

Después de eso, no hay errores o advertencia de php/CakePHP.

* edit: en la última llamada a la función $this->header, coloqué dos puntos (:) entre el 400 y el texto de descripción del error.

10

Por qué no usar Cakes Response Class? Puede establecer el código de estado de la respuesta simplemente esto:

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

A continuación, sólo rinde un archivo con el mensaje de error, que se adapte mejor a JSON.

+0

en el momento de la pregunta no había 2.x aún – mark

+0

Ah, lo siento. No se dio cuenta de eso. Mi error. – nahri

+0

Estaba recibiendo errores hasta que agregué esto antes de esa línea '$ this-> autoRender = false;' –

96

Desde PHP 5.4 puede usar http_response_code.

http_response_code(404); 

Esto se ocupará de establecer los encabezados HTTP adecuados.

Si está ejecutando PHP 5.4 < entonces usted tiene dos opciones:

  1. de actualización.
  2. Use this http_response_code function implementado en PHP.
+1

+ Por proporcionar una respuesta actualizada ya que esta pregunta es uno de los mejores resultados. –

2

Como está escrito antes, pero para principiantes como yo no olvides incluir la devolución.

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