web-dev-qa-db-fra.com

JSON vs Form POST

Nous discutons un peu du sujet de la publication de données sur un point de terminaison REST. Comme les objets sont assez complexes, la solution la plus simple consiste à simplement les sérialiser en JSON et à les envoyer dans l'organisme de demande.

Maintenant, la question est la suivante: est-ce casher? Ou le JSON doit-il être défini en tant que paramètre de formulaire comme data = [JSON]? Ou l'envoi de JSON dans le corps de la demande vient-il d'être mal vu pour forcer les clients à utiliser l'application, à envoyer leurs données via JavaScript au lieu de laisser le navigateur les regrouper sous la forme application/x-www-form-urlencoded?

Je connais les trois options travail. Mais quels sont OK ? Ou au moins recommandé?

40
Johan Öbrink

Je dirais que les deux méthodes fonctionneront bien, il est important que vous restiez cohérent dans toutes vos API. L'option que je choisirais personnellement est simplement d'envoyer le contenu sous la forme application/json.

POST ne vous oblige pas à utiliser application/x-www-form-urlencoded - c'est simplement quelque chose qui est beaucoup utilisé parce que c'est ce que les navigateurs utilisent.

27
Tom van der Woerdt

Il n'y a rien de mal à l'envoyer directement en JSON sérialisé, par exemple google le fait par défaut dans sa bibliothèque volley (qui est évidemment leur recommandé REST pour Android).

En fait, il y a beaucoup de questions sur SO sur la façon dont ne pas utiliser JSON, mais plutôt effectuer des opérations "normales" POST requêtes avec volley. Ce qui est un peu contre-intuitif pour les débutants, ayant à écraser sa méthode _ getParams() de classe de base.

Mais Google ayant sa propre REST faisant cela par défaut, serait mon indicateur que c'est [~ # ~] ok [~ # ~] .

7
Levite

Vous pouvez utiliser JSON dans le cadre des données de demande, car l'OP a indiqué que les trois options fonctionnent.

L'OP doit prendre en charge l'entrée JSON car il doit prendre en charge un contenu structurel complexe. Cependant, pensez-y de cette façon ... faites-vous une demande pour faire quelque chose ou envoyez-vous simplement ce qui est essentiellement des données de document et vous vous trouvez juste pour utiliser l'opération POST comme l'équivalent de créer une nouvelle entrée.

Cela étant le cas, ce que vous avez est fondamentalement un endpoint de ressource avec la sémantique CRUDL. Suite à cela, vous n'êtes en fait pas limité à application/json mais tout type que le noeud final de ressource est censé gérer.

Pour les points de terminaison non liés aux ressources

Je trouve que (spécifiquement pour JAX-RS) le application/x-www-urlencoded on est mieux.

  1. Cohérence avec OAuth 2.0 et OpenID Connect, ils utilisent application/x-www-urlencoded.
  2. Annoter plus facilement les champs individuels à l'aide d'annotations Swagger
  3. Swagger fournit plus de valeurs par défaut.
  4. Postman génère un joli formulaire à remplir et facilite les tests.

Exemples de points de terminaison non liés aux ressources:

  • Authentification
  • Autorisation
  • Recherche simple (bien que j'utiliserais GET sur celui-ci)
  • Recherche non simple où les critères sont nombreux
  • Envoi d'un message/document (même si je considérerais également multipart/form-data afin que je puisse transmettre des métadonnées avec le contenu, mais JAX-RS n'a pas de norme pour celui-ci Jersey et RestEasy ont leurs propres implémentations)
5
Archimedes Trajano