112 votes

Fetch renvoie un corps de réponse vide

J'ai une application react/redux et j'essaie de faire une simple requête GET à un serveur:

fetch('http://example.com/api/node', {
  mode: "no-cors",
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
}).then((response) => {
  console.log(response.body); // null
  return dispatch({
    type: "GET_CALL",
    response: response
  });
})
.catch(error => { console.log('requete échouée', error); });

Le problème est que le corps de la réponse est vide dans la fonction .then() et je ne sais pas pourquoi. J'ai vérifié des exemples en ligne et il semble que mon code devrait fonctionner, donc je manque évidemment quelque chose ici. La chose, c'est que si je vérifie l'onglet réseau dans les outils de développement de Chrome, la requête est faite et je reçois les données que je recherche.

Est-ce que quelqu'un peut éclairer ma lanterne sur ce point?

EDIT:

J'ai essayé de convertir la réponse.

en utilisant .text():

fetch('http://example.com/api/node', {
  mode: "no-cors",
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
})
.then(response => response.text())
.then((response) => {
  console.log(response); // retourne une chaîne vide
  return dispatch({
    type: "GET_CALL",
    response: response
  });
})
.catch(error => { console.log('requete échouée', error); });

et avec .json():

fetch('http://example.com/api/node', {
  mode: "no-cors",
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
})
.then(response => response.json())
.then((response) => {
  console.log(response.body);
  return dispatch({
    type: "GET_CALL",
    response: response.body
  });
})
.catch(error => { console.log('requete échouée', error); }); // Erreur de syntaxe: fin inattendue de l'entrée

En regardant dans les outils de développement de Chrome:

entrer la description de l'image ici

0 votes

Je n'arrivais pas à faire fonctionner fetch donc j'ai commencé à utiliser le redux-api-middleware. Lorsque vous faites la requête, vous devez convertir la réponse en json de la même manière que les gens ici l'ont suggéré:

216voto

Rake Points 31

Je viens de tomber là-dessus. Comme mentionné dans cette réponse, utiliser mode: "no-cors" vous donnera une response opaque, qui ne semble pas renvoyer de données dans le corps.

opaque: Réponse pour une requête "no-cors" à une ressource cross-origin. Sévèrement restreinte.

Dans mon cas, j'utilisais Express. Après avoir installé cors pour Express et l'avoir configuré et enlevé mode: "no-cors", j'ai reçu une promesse. Les données de la réponse seront dans la promesse, par exemple.

fetch('http://example.com/api/node', {
  // mode: 'no-cors',
  method: 'GET',
  headers: {
    Accept: 'application/json',
  },
},
).then(response => {
  if (response.ok) {
    response.json().then(json => {
      console.log(json);
    });
  }
});

7 votes

Pour moi, tout ce qui était nécessaire était d'ajouter .then(json => { à la fin de ma déclaration response.json(). Merci !

2 votes

@MikeKellogg juste un avertissement que si vous voulez garder votre code propre, vous pouvez return response.json() et placer la partie .then(json=> entre la dernière parenthèse et le point-virgule. ).then(json=>{});

0 votes

Il semble que si vous omettez le domaine et utilisez une URI relative, cela fonctionne avec no-cors

38voto

Naisheel Verdhan Points 2195

Vous devrez convertir votre response en json avant de pouvoir accéder à response.body

Depuis la documentation

fetch(url)
  .then(response => response.json())
  .then(json => {
    console.log('json analysé', json) // accéder à json.body ici
  })

0 votes

Bonne réponse, et merci pour la référence à la documentation. Les documents montrent également quoi faire si vous utilisez autre chose que JSON, tel que du texte - cela peut afficher les mêmes comportements et la solution est très similaire (utilisez text() plutôt que json()).

7voto

Florent Points 6599

Vous devez lire le corps de la réponse :

fetch(url)
  .then(res => res.text()) // Lire le corps comme une chaîne de caractères

fetch(url)
  .then(res => res.json()) // Lire le corps comme une chargeutilisateur JSON

Une fois que vous avez lu le corps, vous pourrez le manipuler :

fetch('http://example.com/api/node', {
  mode: "no-cors",
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
})
  .then(response => response.json())
  .then(response => {
    return dispatch({
      type: "GET_CALL",
      response: response
    });
  })

0 votes

Merci pour la réponse! J'ai essayé cela, mais je ne parviens toujours pas à obtenir la bonne réponse. Vérifiez la question modifiée.

0 votes

@RazvanIlin Utilisez .json() à la place de .text()

1 votes

Désolé, je viens de réaliser que j'ai copié le mauvais extrait dans le dernier exemple. J'utilisais en réalité json() là, mais j'obtiens une erreur de syntaxe, que je suppose est déclenchée parce qu'elle ne peut pas convertir la réponse en json

2voto

kunal Points 512
fetch("http://localhost:8988/api", {
    method: "GET",
    headers: {
       "Content-Type": "application/json"
    }
})
.then((response) =>response.json());
.then((data) => {
    console.log(data);
})
.catch(error => {
    return error;
});

2 votes

Tandis que ce code peut répondre à la question de l'OP, quelques mots d'explication ajoutés aideraient grandement les lecteurs actuels et futurs à comprendre votre réponse.

0 votes

Il s'agit en réalité d'un exemple très similaire à d'autres réponses ici. Pas sûr des politiques de SO, mais je ne sais pas si c'est permis

0 votes

Seulement ce n'est pas la même chose. "Content-Type" est unique. Dommage que cela n'ait pas fonctionné pour moi :(

1voto

Damien Leroux Points 5089

Essayez d'utiliser response.json():

fetch('http://example.com/api/node', {
  mode: "no-cors",
  method: "GET",
  headers: {
    "Accept": "application/json"
  }
}).then((response) => {
  console.log(response.json()); // null
  return dispatch({
    type: "GET_CALL",
    response: response.json()
  });
})
.catch(error => { console.log('requête échouée', error); });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X