2017-10-12 1 views
0

Je courais un serveur Springboot local, que lorsque je y accéder localement dans le navigateur, me donne un objet JSON valide correctement formaté (je l'ai vérifié ce via formatter JSON).Réception JSON entre les questions locales React App et service Springboot locales

Je suis également en cours d'exécution au niveau local une application utilisant React nœud. J'essaie d'utiliser fetch() pour récupérer cet objet JSON et rencontrer des problèmes. Enfin, contourner les problèmes d'en-tête CORs, mais ne peut pas comprendre pourquoi l'objet JSON ne revient pas. Voici mon code

var headers = new Headers(); 
headers.append("Content-type", "application/json;charset=UTF-8"); 

var myInit = { method: 'GET', 
       headers: headers, 
       mode: 'no-cors', 
       cache: 'default', 
};  

fetch(`http://localhost:3010/getJSON`, myInit) 
    .then(function(response){ 
    console.log(response.data); 
    console.log(response); 
    console.log(JSON.parse(JSON.stringify(response))); 
    },function(error){ 
    console.log(error); 
    }); 

Alors, quand je lance ceci dans Chrome avec le débogueur, les réponses aux 3 déclarations du journal sont:

1er enregistreur

undefined 

2ème enregistreur

Response {type: "opaque", url: "", redirected: false, status: 0, ok: false,   
…} 
body 
: 
(...) 
bodyUsed 
: 
false 
headers 
: 
Headers {} 
ok 
: 
false 
redirected 
: 
false 
status 
: 
0 
statusText 
: 
"" 
type 
: 
"opaque" 
url 
: 
"" 
__proto__ 
: 
Response 

3ème enregistreur

{} 

J'ai essayé beaucoup de différents parsing JSON, stringify, etc, en vain. La prochaine partie déroutante, est si dans le débogueur Chrome je vais dans l'onglet "Réseau", cliquez sur le/getJSON, il me montre tout l'objet JSON tout à fait bien dans les onglets "Aperçu" et "Réponse" . Donc, clairement, Chrome se connecte correctement. Voici l'onglet « têtes » de Chrome au sein de « réseau »:

Request URL:http://localhost:3010/getJSON 
Request Method:GET 
Status Code:200 
Remote Address:[::1]:3010 
Referrer Policy:no-referrer-when-downgrade 
Response Headers 
view source 
Content-Type:application/json;charset=UTF-8 
Date:Thu, 12 Oct 2017 16:05:05 GMT 
Transfer-Encoding:chunked 
Request Headers 
view source 
Accept:*/* 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Host:localhost:3010 
Referer:http://localhost:3000/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 

J'ai essayé d'imiter cet en-tête dans ma demande, mais ne sais pas comment il est différent? Toute aide serait grandement appréciée car je me bats actuellement la tête contre le chemin avec ça!

+0

essayer de frapper votre api avec RESTClient ou Postman et vérifier wether les données sont correctement – John

+0

à venir Vous devez spécifier pas le mode ': « non-cors''. La raison pour laquelle l'objet JSON ne revient pas est que vous avez spécifié 'mode: 'no-cors''. Ce que dit le navigateur, * "Ne laissez en aucun cas mon code JavaScript frontend accéder à la réponse." * Si la raison pour laquelle vous avez spécifié 'mode: 'no-cors' est que vous obtenez autrement un CORS erreur, puis la bonne façon de corriger que c'est de configurer le serveur que vous faites la demande afin qu'il renvoie les bons en-têtes CORS dans sa réponse. – sideshowbarker

+0

La raison pour laquelle vous pouvez voir la réponse de l'onglet Devtools Network est que le navigateur obtient la réponse très bien. Mais le simple fait que le navigateur obtienne la réponse ne signifie pas qu'il exposera cette réponse à votre code JavaScript.Le navigateur n'expose la réponse à votre code que si la réponse inclut l'en-tête Access-Control-Allow-Origin. – sideshowbarker

Répondre

0

Vous obtenez une réponse opaque, ce qui me dit que peut-être vous ne l'avez pas complètement résolu les en-têtes CORS situation. Si vous récupérez à partir du client, je vous suggère de le faire par l'intermédiaire de votre nodejs afin qu'au lieu d'appeler votre service springboot, vous appeliez node, vous évitant ainsi les problèmes de cors.

EDIT

Vous pouvez créer quelque chose comme ceci:

import express from 'express'; 
import request from 'request'; 

const router = express.Router(); 

router.get('/proxyname', (req, res) => { 
    // Removing IPv4-mapped IPv6 address format, if present 
    const requestUrl = [your service's endpoint]; 

    request(requestUrl, (err, apiResponse, body) => { 
    res.status(apiResponse.statusCode); 
    try { 
     res.json(JSON.parse(body)); 
    } catch (e) { 
     res.send(body); 
    } 
    }); 
}); 

export default router; 

puis sur votre fichier serveur nodejs, ajoutez, comme ceci:

import proxy from '[path to proxy file above]'; 
app.use('/path-to-endpoint', proxy); 

puis appeler du client au lieu de votre service SpringBoot.

+0

J'ai donc essayé d'ajouter un proxy via le paquetage.json, et j'ai aussi essayé d'utiliser un agent http dans mon appel fetch(), mais je n'ai pas eu de chance avec l'un ou l'autre jusqu'à présent. Aucune suggestion? – bcannariato

+0

Sur votre question initiale, vous mentionnez "Je suis également en train de lancer une application React en utilisant un noeud". C'est là que j'ai eu l'idée du proxy. Vous devez créer un point de terminaison avec la bibliothèque http, quelle qu'elle soit, que vous utilisez. À partir du corps de ce point de terminaison, vous appelez votre service SpringBoot et renvoyez la réponse. – jarz

+0

Juste ajouté un exemple de ce que je veux dire sur ma réponse, en supposant que vous exécutez cela sur nodejs – jarz