différences d'application / json et application / x-www-form-urlencoded

159

Quelle est la différence entre

request.ContentType = "application / json; charset = utf-8";

et

webRequest.ContentType = "application / x-www-form-urlencoded";

Prithvi Raj Nandiwal
la source

Réponses:

187

Le premier cas indique au serveur Web que vous publiez des données JSON comme dans:

{ Name : 'John Smith', Age: 23}

La deuxième option indique au serveur Web que vous encoderez les paramètres dans l'URL comme dans:

Name=John+Smith&Age=23
Icare
la source
17
Quelles implications cela a-t-il du côté serveur. Je vois des sites comme stackoverflow et Twitter utiliser x-www-form-urlencodedpour les demandes AJAX comme vote, etc. La réponse renvoyée est JSON. Je pense qu'il vaut mieux avoir une paire demande / réponse symétrique, c'est-à-dire à la fois JSON.
utilisateur
@buffer Je suis également curieux de connaître la réponse à votre question symétrique.
Adam Johns
1
@AdamJohns: Ce blog vaut la peine d'être lu bien qu'il ne réponde pas exactement au "pourquoi": homakov.blogspot.in/2012/06
utilisateur
21
@buffer Je crois comprendre que l'utilisation de JSON comme contentType aide lorsque les données à envoyer sont plus complexes et impliquent beaucoup de hiérarchie .. alors que le format encodé est bon pour envoyer des paramètres simples dans l'URL qui peuvent être lus au backend sans trop de code. .. Je suppose que cela répond à la partie pourquoi.
Ankit Srivastava
@Medorator Un commentaire tardif. Bien que, par exemple, lorsque vous envoyez un objet JSON complexe avec un tableau d'objets, l'utilisation application/x-www-form-urlencodedconfondrait le serveur (Elixir utilisant Poison dans mon cas) et entraînerait une analyse inappropriée de l'objet (il convertissait en quelque sorte le tableau imbriqué d'objets sur une carte, au lieu d'une liste). L'utilisation application/jsondevrait être le bon choix dans ce cas.
xji
6

webRequest.ContentType = "application / x-www-form-urlencoded";

  1. D'où vient le nom de application / x-www-form-urlencoded ?

    Si vous envoyez une requête HTTP GET , vous pouvez utiliser les paramètres de requête comme suit:

    http://example.com/path/to/page? name = furet & color = violet

    Le contenu des champs est codé sous forme de chaîne de requête. Le application/x-www-form- urlencodednom du fichier provient du paramètre de requête url précédent, mais les paramètres de requête se trouvent dans le corps de la requête au lieu de l'url.

    L'ensemble des données du formulaire est envoyé sous la forme d'une longue chaîne de requête. La chaîne de requête contient des paires nom-valeur séparées par un caractère &

    par exemple, champ1 = valeur1 & champ2 = valeur2

  2. Il peut s'agir d'une simple requête appelée simple - ne déclenchez pas de contrôle avant le vol

    Une requête simple doit avoir certaines propriétés. Vous pouvez regarder ici pour plus d'informations. L'un d'eux est qu'il n'y a que trois valeurs autorisées pour l'en-tête Content-Type pour les demandes simples

    • application / x-www-form-urlencoded
    • multipart / form-data
    • texte simple

3.Pour la plupart des arbres de paramètres plats, application / x-www-form-urlencoded a fait ses preuves.

request.ContentType = "application / json; charset = utf-8";

  1. Les données seront au format json .

axios et superagent , deux des bibliothèques HTTP npm les plus populaires, fonctionnent avec les corps JSON par défaut.

{
  "id": 1,
  "name": "Foo",
  "price": 123,
  "tags": [
    "Bar",
    "Eek"
  ],
  "stock": {
    "warehouse": 300,
    "retail": 20
  }
}
  1. "application / json" Content-Type est l'une des requêtes contrôlées en amont .

Maintenant, si la requête n'est pas une simple requête , le navigateur envoie automatiquement une requête HTTP avant la requête d'origine par la méthode OPTIONS pour vérifier s'il est sûr d'envoyer la requête d'origine. Si c'est ok, envoyez la demande réelle. Vous pouvez regarder ici pour plus d'informations.

  1. application / json est adapté aux débutants. Les tableaux encodés en URL peuvent être un cauchemar!
fgul
la source