web-dev-qa-db-fra.com

Définir le code d'état de réponse

J'ai un appel d'API pour lequel j'ai besoin de pouvoir exécuter certaines vérifications et potentiellement renvoyer divers codes d'état. Je n'ai pas besoin de vues personnalisées ni de quoi que ce soit, je dois simplement renvoyer le code approprié. Si l'utilisateur n'a pas passé les informations d'identification appropriées, je dois retourner le statut 401. S'ils n'ont pas envoyé un format de demande pris en charge, je dois retourner un statut 400.

Parce que c'est une API, tout ce que je veux vraiment faire est de définir le statut de la réponse et de quitter avec un simple message stupide expliquant pourquoi la demande a échoué (probablement en utilisant une variable exit). Juste assez pour faire le travail, mais je n'ai pas réussi à le faire fonctionner correctement. J'ai essayé d'utiliser header() de PHP et $this->header() de Cake (tout se trouve dans le contrôleur), mais bien que je reçoive le message de sortie, l'en-tête affiche l'état 200 OK.

En utilisant le code ci-dessous, je reçois le message, mais l'en-tête n'est pas défini. Qu'est-ce que je rate?

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

PHP <= 5.3

La fonction header() a un paramètre pour le code d'état. Si vous le spécifiez, le serveur s'en chargera à partir de là.

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

PHP> = 5.4

Voir la réponse de Gajus: https://stackoverflow.com/a/14223222/362536

124
Brad

Depuis PHP 5.4, vous pouvez utiliser http_response_code .

http_response_code(404);

Cela vous permettra de définir les en-têtes HTTP appropriés.

Si vous utilisez PHP <5.4, vous avez deux options:

  1. Améliorer.
  2. Utilisez cette fonction http_response_code implémentée en PHP.
109
Gajus

Pourquoi ne pas utiliser Cakes Response Class? Vous pouvez définir le code d’état de la réponse simplement par ceci:

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

Il vous suffit ensuite de restituer un fichier contenant le message d'erreur, ce qui convient le mieux avec JSON.

11
nahri

Je ne pense pas que vous définissiez correctement header , essayez ceci:

header('HTTP/1.0 401 Unauthorized');
11
Wesley Murch

J'ai eu le même problème avec CakePHP 2.0.1

J'ai essayé d'utiliser

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

et

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

Cependant, aucun de ceux-ci n'a résolu mon problème.

Je l'ai finalement résolu en utilisant

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

Après cela, pas d'erreurs ou d'avertissement de php/CakePHP.

* edit: Dans le dernier appel de fonction $this->header, j'ai mis un signe deux-points (:) entre le 400 et le texte de description de l'erreur.

4
Michael Temple

Comme précédemment, mais pour les débutants comme moi, n'oubliez pas d'inclure le retour.

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