3 votes

En-têtes de réponse manquants avec le code de statut http 102

Je suis actuellement en train de développer un REST API dans laquelle je dois retourner un 102 HTTP status code (traitement) pendant que je génère une exportation.

Flux de travail :

  1. POST /exports
    • retourner 201 avec les données
  2. GET /exports/id
    • retourne 102 avec les données si l'exportation est en cours de traitement
    • retourne 200 avec les données si l'exportation est terminée

Lorsque j'essaie de récupérer les données d'exportation en cours de traitement, il n'y a pas d'en-tête de réponse : les en-têtes de réponse sont absents avec le code d'état HTTP 102. Si je modifie le code d'état avec 2xx par exemple, cela fonctionne bien. Je n'arrive pas à comprendre. Y a-t-il quelque chose de spécifique avec le code d'état HTTP 102 ? Quand je dis que les en-têtes de réponse sont manquantes, je veux dire : Chrome > Developer tools > Network Tab > Click on request > Headers tab > Only showing "General" and "Request Headers" (same with FF & Postman) .

Technologies utilisées :

  • Ubuntu 18.04 LTS
  • PHP 7.2 (dernière version)
  • laravel/lumen 5.6.21
  • Apache 2.4.29

Code du contrôleur :

 /**
 * Return export by id
 *
 * @param int $id
 * @return \Illuminate\Http\JsonResponse
 *
 * @throws AuthorizationException
 * @throws ModelNotFoundException
 */
public function getItem(int $id)
{
    if($export = Export::find($id))
    {
        $this->authorize(__FUNCTION__, $export);

        if($export->status != Export::STATUS_COMPLETED)
        {
            return response()->json($export, 102);
        }

        return response()->json($export);
    }

    throw new ModelNotFoundException();
}

En-têtes de requête attendus :

  • Contrôle d'accès - Autoriser l'origine
  • Cache-Control
  • Connexion
  • Content-Length
  • Content-Type
  • Date
  • Connexion par proxy
  • Serveur
  • Varier

EDIT

J'aurais dû mentionner que cela fonctionnait sur ma configuration précédente :

  • Ubuntu 17.10 LTS
  • PHP 7.1 (dernière version)
  • laravel/lumen 5.6.16
  • Apache 2.4.27

Je n'ai pas trouvé dans les notes de version ce qui aurait pu avoir un impact sur la réponse à la demande.

0voto

lev Points 53

Utilisez HTTP 202 Accepted à la place.

Voir : https://softwareengineering.stackexchange.com/questions/316208/http-status-code-for-still-processing

Expliqué :

La RFC 2518 dit "Le serveur DOIT envoyer une réponse finale après que la demande ait été complétée", et cela est interprété comme signifiant que votre serveur doit envoyer un code de réponse final. en outre à l'initiale HTTP 102 . Ne pas le faire crée des problèmes de délai d'attente pour les clients qui attendent une réponse finale mais ne l'obtiennent pas. Firefox s'étouffe, Chrome se met en dépassement de délai et le convertit en HTTP 200 OK . cURL informera qu'il y a du contenu non lu.

Alors, utilisez HTTP 102 Processing uniquement comme un indice pour les clients : "D'accord, mais cela peut prendre une minute...", après quoi vous donnez un code final et un corps de réponse.

S'il s'agit d'un processus de longue durée que vous souhaitez interroger périodiquement, utilisez la fonction HTTP 202 Accepted et fermez la réponse.

Il convient également de noter que http_response_code() ne traite pas HTTP 102 .

Mauvais exemple :

<?php header('HTTP/1.1 102 Processing'); exit; ?>

Bon exemple :

<?php
header('HTTP/1.1 102 Processing'); // let client know it might take a while
sleep(2); // do stuff that takes a while
header('HTTP/1.1 200 OK'); // counterintuitive, but works

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X