J'essaye de POSTER un objet JSON à l'aide de la récupération .
D'après ce que je peux comprendre, je dois attacher un objet stratifié au corps de la demande, par exemple:
fetch("/echo/json/",
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "POST",
body: JSON.stringify({a: 1, b: 2})
})
.then(function(res){ console.log(res) })
.catch(function(res){ console.log(res) })
Lorsque j'utilise l'écho json de jsfiddle, je m'attendrais à voir l'objet que j'ai envoyé ( {a: 1, b: 2}
), mais cela ne se produit pas - chrome devtools n'affiche même pas le JSON dans le cadre de la demande, ce qui signifie qu'il n'est pas envoyé.
javascript
json
fetch-api
Rasoir
la source
la source
{}
res.json()
devrait revenir{a: 1, b: 2}
.json
propriété qui contient les données que vous souhaitez envoyer. Cependant, jebody
ne suis pas traité correctement de toute façon. Voir ce violon pour voir que le délai de 5 secondes est ignoré. jsfiddle.net/99arsnkg De plus, lorsque vous essayez d'ajouter des en-têtes supplémentaires, ils sont ignorés. C'est probablement un problème avecfetch()
lui-même.Réponses:
Avec le
async/await
support ES2017 , voici comment utiliserPOST
une charge utile JSON:Vous ne pouvez pas utiliser ES2017? Voir la réponse de @ vp_art en utilisant des promesses
La question demande cependant un problème causé par un bug de chrome corrigé depuis longtemps.
La réponse originale suit.
C'est le vrai problème ici , et c'est un bogue avec chrome devtools , corrigé dans Chrome 46.
Ce code fonctionne bien - il POSTE correctement le JSON, il ne peut tout simplement pas être vu.
cela ne fonctionne pas car ce n'est pas le format correct pour l'écho de JSfiddle .
Le bon code est:
Pour les points finaux acceptant les charges utiles JSON, le code d'origine est correct
la source
x-www-form-urlencoded
) avec des données JSON dans un champ nomméjson
. Les données sont donc doublement codées. Pour un article JSON propre, voir la réponse de @vp_arth ci-dessous.res.ok
au cas où le code de réponse serait une sorte d'erreur. Il serait également bon d'avoir une.catch()
clause à la fin. Je me rends compte que ce n'est qu'un exemple d'extrait, mais gardez ces choses à l'esprit pour une utilisation dans le monde réel.Je pense que votre problème est de
jsfiddle
pouvoir traiter laform-urlencoded
demande uniquement.Mais la bonne façon de faire une demande json est de passer correctement en
json
tant que corps:la source
x-www-form-urlencoded
vsapplication/json
, soit en les dépareillant, soit en encapsulant JSON dans des chaînes encodées en URL./echo
itinéraire de jsfiddle ?Depuis les moteurs de recherche, je me suis retrouvé sur ce sujet pour les données de publication non json avec fetch, alors j'ai pensé l'ajouter.
Pour les non-json, vous n'avez pas besoin d'utiliser les données du formulaire. Vous pouvez simplement définir l'en-
Content-Type
têteapplication/x-www-form-urlencoded
et utiliser une chaîne:Une autre façon de construire cette
body
chaîne, plutôt que de la taper comme je l'ai fait ci-dessus, est d'utiliser des bibliothèques. Par exemple lastringify
fonction fromquery-string
ouqs
packages. Donc, en utilisant cela, cela ressemblerait à:la source
Après avoir passé quelques temps, inverser l'ingénierie jsFiddle, essayer de générer de la charge utile - il y a un effet.
Veuillez prendre soin (attention) en ligne
return response.json();
lorsque la réponse n'est pas une réponse - c'est une promesse.jsFiddle: http://jsfiddle.net/egxt6cpz/46/ && Firefox> 39 && Chrome> 42
la source
'x-www-form-urlencoded
placeapplication/json
? Quelle est la différence?application/json
c'est la bonne forme et cela fonctionne maintenant. Merci pour le bon œilfetch
( stackoverflow.com/questions/41984893/… ) au lieu deapplication/json
. Peut-être savez-vous pourquoi ...Content-Type
vraiapplication/json
, mais votre réelbody
semble êtrex-www-form-urlencoded
- je ne pense pas que cela devrait fonctionner? Si cela fonctionne, votre serveur doit être assez indulgent. La réponse de @vp_arth ci-dessous semble être la bonne.J'ai créé un wrapper fin autour de fetch () avec de nombreuses améliorations si vous utilisez une API REST purement json:
Pour l'utiliser, vous avez la variable
api
et 4 méthodes:Et au sein d'une
async
fonction:Exemple avec jQuery:
la source
Object.assign
? devrait êtreObject.assign({}, api.headers, headers)
parce que vous ne voulez pas continuer à ajouter des personnalisationsheaders
dans le hachage communapi.headers
. droite?Ceci est lié à
Content-Type
. Comme vous l'avez peut-être remarqué lors d'autres discussions et réponses à cette question, certaines personnes ont pu la résoudre en définissantContent-Type: 'application/json'
. Malheureusement dans mon cas cela n'a pas fonctionné, ma requête POST était toujours vide côté serveur.Cependant, si vous essayez avec jQuery
$.post()
et que cela fonctionne, la raison est probablement que jQuery utiliseContent-Type: 'x-www-form-urlencoded'
au lieu deapplication/json
.la source
Eu le même problème - non
body
été envoyé d'un client à un serveur.L'ajout d'un en-
Content-Type
tête l'a résolu pour moi:la source
La première réponse ne fonctionne pas pour PHP7, car son encodage est incorrect, mais je pourrais trouver le bon encodage avec les autres réponses. Ce code envoie également des cookies d'authentification, que vous souhaiterez probablement lorsque vous traitez, par exemple, avec des forums PHP:
la source
Cela pourrait être utile à quelqu'un:
J'avais le problème que les données du formulaire n'étaient pas envoyées pour ma demande
Dans mon cas, c'était une combinaison des en-têtes suivants qui causaient également le problème et le mauvais type de contenu.
J'envoyais donc ces deux en-têtes avec la demande et ce n'était pas l'envoi des données de formulaire lorsque j'ai supprimé les en-têtes qui fonctionnaient.
De même, comme d'autres réponses suggèrent que l'en-tête Content-Type doit être correct.
Pour ma demande, l'en-tête de type de contenu correct était:
Donc, en fin de compte, si vos données de formulaire ne sont pas jointes à la demande, cela pourrait potentiellement être vos en-têtes. Essayez de réduire au minimum vos en-têtes, puis essayez de les ajouter un par un pour voir si votre problème est résolu.
la source
Je pense que, nous n'avons pas besoin d'analyser l'objet JSON dans une chaîne, si le serveur distant accepte json dans leur demande, exécutez simplement:
Tels que la demande de boucle
Dans le cas où le serveur distant n'accepte pas un fichier json comme corps, envoyez simplement un dataForm:
Tels que la demande de boucle
la source
curl
fait implicitement votre commande! Si vous ne strifiez pas vos objets avant de les passer commebody
vous les enverrez simplement"[object Object]"
comme corps de votre demande. Un simple test dans Dev Tools vous le montrerait. Ouvrez-le et essayez ceci sans quitter cet onglet:a = new FormData(); a.append("foo","bar"); fetch("/foo/bar", { method: 'POST', body: {}, headers: { 'Content-type': 'application/json' } })
Si votre charge utile JSON contient des tableaux et des objets imbriqués, j'utiliserais
URLSearchParams
laparam()
méthode de jQuery .Pour votre serveur, cela ressemblera à un HTML standard en
<form>
cours d'POST
édition.la source