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.
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)
})
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: [] } ] }
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: {}
| logiciel | version
| ---------------- | -------
| demande | 2.81.0
| nœud | 8.3.0
| npm | 5.1.0
| Système d'exploitation | Ubuntu 16.04.2 LTS
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="
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="