4 votes

Comment formater en JSON une réponse d'erreur HTTP dans webapp2 ?

J'utilise webapp2 pour le développement dans App Engine. Ce que j'aimerais faire, c'est envoyer une réponse personnalisée au format JSON en cas d'erreur. Par exemple, lorsque la longueur de la requête est supérieure à un seuil, répondre avec HTTP 400 et le corps de la réponse.

{'error':'InvalidMessageLength'}

Dans webapp2, il est possible d'attribuer des gestionnaires d'erreurs pour certaines exceptions. Par exemple :

app.error_handlers[400] = handle_error_400

Où handle_error_400 est le suivant :

def handle_error_400(request, response, exception):
    response.write(exception)
    response.set_status(400)

Lorsque webapp2.RequestHandler.abort(400) est exécuté, le code ci-dessus est exécuté.

Comment est-il possible d'avoir différents formats de réponse (HTML et JSON) de manière dynamique sur la base de la configuration ci-dessus ? C'est-à-dire, comment est-il possible d'appeler différentes versions de handle_error_400 fonction ?

5voto

Lipis Points 9135

Voici un exemple entièrement fonctionnel qui démontre comment avoir le même gestionnaire d'erreurs pour tous les types d'erreurs et si votre URL commence par /json alors la réponse sera un application/json (utilisez votre imagination sur la façon dont vous pourriez faire un bon usage de la request pour décider du type de réponse à fournir) :

import webapp2
import json

def handle_error(request, response, exception):
  if request.path.startswith('/json'):
    response.headers.add_header('Content-Type', 'application/json')
    result = {
        'status': 'error',
        'status_code': exception.code,
        'error_message': exception.explanation,
      }
    response.write(json.dumps(result))
  else:
    response.write(exception)
  response.set_status(exception.code)

app = webapp2.WSGIApplication()
app.error_handlers[404] = handle_error
app.error_handlers[400] = handle_error

Dans l'exemple ci-dessus, vous pouvez facilement tester les différents comportements en visitant les URL suivantes qui renverront un 404 qui est l'erreur la plus facile à tester :

http://localhost:8080/404
http://localhost:8080/json/404

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