Relire un corps de réponse à partir de JavaScript de chercher
fetch()
retourne promesse qui (en cas de succès) correspond à un Réponse
objet. Un très fréquent chose à faire est d'appeler immédiatement Réponse.json()
pour convertir le corps de la réponse à un objet JSON.
Si le corps de la réponse n'est pas valide JSON, puis le Response.json()
promesse échoue avec une erreur. Le message est quelque chose le long des lignes de:
Jeton inattendu X en JSON à la position 0
Ce n'est pas très utile lorsque vous essayez de diagnostiquer le problème; idéalement, je voudrais être en mesure de voir le contenu à partir du serveur (ce qui est souvent un message d'erreur).
Cependant, il semble que vous ne pouvez lire le flux à Response.body
une fois (au moins dans Chrome). (Il y a même un en lecture seule Réponse.bodyUsed
drapeau.) Qui a déjà eu lieu lors de la Response.json()
essaie de convertir le corps en JSON, de sorte que le corps semble être perdu pour toujours dans le cas d'un JSON échec d'analyse.
Est-il un moyen de récupérer l'original de la réponse du corps... bref de lecture manuelle (et puis de les convertir en JSON) lorsque l'original fetch
Promesse résout?
response.text()
au lieu de lire les données renvoyées même si ce n'est pas JSON valide, et vous pouvez cloner une réponse, mais, idéalement, votre serveur doit être toujours de retour JSON lorsque vous vous y attendez JSON, même les erreurs doivent être retournés sous forme de JSON.OriginalL'auteur Craig Walker | 2016-11-08
Vous devez vous connecter pour publier un commentaire.
Utilisation
Réponse.clone()
clonerResponse
Vous pouvez également utiliser
Response.body.getReader()
qui renvoie uneReadableStream
à lireResponse
comme un ruisseau,TextDecoder()
pour convertirUint8Array
flux de données de texte.clone() de la réponse, mais il ne fonctionne pas si vous avez déjà appelé .json(): "TypeError: Échec de l'exécution de "clone" sur la 'Réponse': le corps de la Réponse est déjà utilisé" Alors, resp.texte (), suivie par manuel parsing json est une option, mais +1 pour Jaromanda la suggestion de clone() avant d'appeler json()!
Oui,
.clone()
doit être appelée avantbody
est lu. C'est pourquoijavascript
à Réponse estresponse.clone()
. Avez-vous lu la spécification fetch.spec.whatwg.org/#body-mixin, fetch.spec.whatwg.org/#bodies, fetch.spec.whatwg.org/#dom-response-clone ?Je suis
Failed to execute 'clone' on 'Response': Response body is already used
Puis
Response.body
a déjà été utilisé dans le code. Pouvez-vous créer un jsfiddle jsfiddle.net ou plnkr plnkr.co pour démontrer?OriginalL'auteur guest271314
J'ai eu à traiter avec une API qui parfois bâclé la réponse JSON - avant de retourner
response.json()
j'ai fait un clone de l'objet de réponse. à l'aide d'un bloc catch, je peux déterminer si l'erreur est une SyntaxError, et de procéder à la correction de l'erreur en utilisant le texte de la suite de la réponse cloneun peu comme ceci:
fixJson
est juste une fonction qui corrige les données reçues - dans mon cas, quand il a été brisé JSON, il a toujours été cassé de la même façon, je pense qu'il a eu un plus grand { de début ou de fin } - ne peut pas rappelerre-lecture de la question, vous êtes plus susceptibles de vouloir enregistrer l'erreur dans la console plutôt que de fixer le json facile de réécriture:
OriginalL'auteur Jaromanda X