Request: La publication avec un tableau vide dans le formulaire supprime la propriété

Créé le 15 août 2017  ·  3Commentaires  ·  Source: request/request

Sommaire


Il semble qu'il y ait une forme d'optimisation dans le formulaire lors de la publication. C'est mauvais pour moi, cela supprime des propriétés du formulaire.
J'essaie d'envoyer un objet avec une propriété contenant un tableau qui pourrait être vide.
Chaque fois que le tableau est vide, une MissingPropertyError est renvoyée, ce qui est incorrect car le tableau vide contient en fait une valeur au lieu de ne pas avoir la propriété du tout.

Exemple le plus simple à reproduire

const request = require( 'request' )
const bodyParser = require('body-parser')
const app = require('express')()

app.use( bodyParser.json() )
app.use( bodyParser.urlencoded( { extended: true } ) )

app.post('/', function( req, res ){
    console.log( 'received:', req.body )
    res.send('ok')
})
app.listen( 53153 )

const req = {
    url: 'http://localhost:53153',
    method: 'POST',
    headers: {
        'Content-Type' : 'application/x-www-form-urlencoded'
    },
    form: {
        emptyArray: [],
        filledArray: [{something:[]}]
    }
}
console.log( 'sending:', req )
request( req , function( err, httpResponse, body ){
    process.exit(0)
})

Comportement prévisible




Je m'attendais à ce que l'objet d'envoi soit reçu, car il s'agit d'un json valide

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: { emptyArray: [], filledArray: [ { something: [] } ] }

Comportement actuel



Il s'avère que l'objet reçu n'est rien d'autre qu'un objet vide, en regardant wireshark, la longueur du contenu envoyé est 0.

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: {}

l'ajout de null au tableau change le comportement :

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [ null ], filledArray: [ { something: [ null ] } ] }
received: { emptyArray: [ '' ], filledArray: [ { something: [ '' ] } ] }

cependant ajouter undefined dans les tableaux ne change pas le comportement :

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [ undefined ], filledArray: [ { something: [ undefined ] } ] }
received: {}

Solution possible


Le contexte


Votre environnement

| logiciel | version
| ---------------- | -------
| demande | 2.81.0
| nœud | 8.3.0
| npm | 5.1.0
| Système d'exploitation | Ubuntu 16.04.2 LTS

stale

Commentaire le plus utile

Je n'arrive pas à croire qu'aucune des personnes travaillant sur ce projet n'ait de contribution à ce sujet. la réponse ci-dessus est invalide car elle ne comprend pas le cas d'utilisation mentionné. Pourquoi fournissons-nous un exemple pour « application/json » alors que la question concerne clairement « application/x-www-form-urlencoded ». Il s'agit d'un problème qui persiste mais qui, malheureusement, n'est pas pris en compte.

Dans mon test, les tableaux indéfinis et vides disparaîtront dans les résultats et tout ce qui est « null » apparaîtra dans la chaîne url-encoded.

un json de :
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
donnera une URL avec seulement
"?results%5Barr3%5D="

Tous les 3 commentaires

Ainsi, il semble que l'objet JSON soit converti en une chaîne et soit défini comme le corps de la demande avant d'être envoyé. C'est le comportement par défaut lorsque vous spécifiez l'attribut 'form'. La méthode utilisée par cette bibliothèque pour convertir JSON en chaîne supprime les tableaux vides. Ce que vous devez faire, c'est au lieu de passer l'attribut 'form', passez l'attribut 'body' et JSON.stringify votre objet JSON pour le convertir en une chaîne. Par exemple:

REMARQUE : VOUS POURRIEZ AVOIR BEAUCOUP DE MESSAGE AVEC LES EN-TÊTES ET UTILISER application/json comme type de contenu. Je n'ai pas testé pour voir ce qui fonctionne.

{
    url: 'http://localhost:53153',
    method: 'POST',
    headers: { 'Content-Type': 'application/json'},
    body: JSON.stringify({ emptyArray: [], filledArray: [ { something: [] } ] })
}

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

Je n'arrive pas à croire qu'aucune des personnes travaillant sur ce projet n'ait de contribution à ce sujet. la réponse ci-dessus est invalide car elle ne comprend pas le cas d'utilisation mentionné. Pourquoi fournissons-nous un exemple pour « application/json » alors que la question concerne clairement « application/x-www-form-urlencoded ». Il s'agit d'un problème qui persiste mais qui, malheureusement, n'est pas pris en compte.

Dans mon test, les tableaux indéfinis et vides disparaîtront dans les résultats et tout ce qui est « null » apparaîtra dans la chaîne url-encoded.

un json de :
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
donnera une URL avec seulement
"?results%5Barr3%5D="

Cette page vous a été utile?
0 / 5 - 0 notes