J'ai une application de réaction/redux et j'essaye 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('request failed', 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, alors il manque évidemment quelque chose ici. Si je vérifie l'onglet Réseau dans les outils de développement de Chrome, la demande est faite et je reçois les données que je cherche.
Quelqu'un peut-il faire la lumière sur celui-ci?
MODIFIER:
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); // returns empty string
return dispatch({
type: "GET_CALL",
response: response
});
})
.catch(error => { console.log('request failed', 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('request failed', error); }); // Syntax error: unexpected end of input
En regardant dans les outils de développement chromés:
Je viens de courir dans cela. Comme mentionné dans ce answer , utiliser mode: "no-cors"
vous donnera un opaque response
, qui ne semble pas renvoyer de données dans le corps.
opaque: réponse de la demande “no-cors” à la ressource d'origine croisée . sévèrement restreint .
Dans mon cas, j'utilisais Express
. Une fois que j’ai installé cors pour Express , que je l’ai configuré et que j'ai retiré mode: "no-cors"
, une promesse m’a été retournée. Les données de réponse seront dans la promesse, par ex.
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);
});
}
});
Vous devrez convertir votre response
en json
avant de pouvoir accéder à response.body
De la docs
fetch(url)
.then(response => response.json())
.then(json => {
console.log('parsed json', json) // access json.body here
})
Vous devez lire le corps de la réponse:
fetch(url)
.then(res => res.text()) // Read the body as a string
fetch(url)
.then(res => res.json()) // Read the body as JSON payload
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
});
})
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;
});
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('request failed', error); });
fetch("http://localhost:8988/api", {
//mode: "no-cors",
method: "GET",
headers: {
"Accept": "application/json"
}
})
.then(response => {
return response.json();
})
.then(data => {
return data;
})
.catch(error => {
return error;
});
Cela fonctionne pour moi.