在本地React App和本地Springboot服务问题之间接收JSON

时间:2017-10-12 16:26:01

标签: javascript json reactjs google-chrome

我正在运行一个本地Springboot服务器,当我在浏览器中本地访问它时,给我一个正确格式化的有效JSON对象(我通过JSON格式化器验证了这一点)。

我也使用node在本地运行React应用程序。我试图使用fetch()来获取该JSON对象并遇到问题。最后解决了CORs头问题,但不能弄清楚为什么JSON对象不会回来。这是我的代码

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);
  });

因此,当我使用调试器在Chrome中运行此代码时,对3个日志语句的响应为:

第一个记录器

undefined

第二记录器

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记录器

{}

我尝试了许多不同的JSON解析,字符串化等,但无济于事。

下一个令人困惑的部分是,如果在Chrome调试器中我转到“网络”选项卡,单击/ getJSON,它会在“预览”和“响应”选项卡中向我显示整个JSON对象。很明显,Chrome正确连接到它。这是“网络”中Chrome的“标题”标签:

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

我试图在我的请求中模仿这个标题,但不确定它有何不同?任何帮助都将非常感激,因为我正在用这个方式撞击我的方式!

1 个答案:

答案 0 :(得分:0)

你得到一个不透明的回复,告诉我你可能还没有完全解决了cors标题的情况。如果您从客户端获取,我建议通过您的nodejs代理它,这样您就可以调用节点,而不是调用springboot服务,从而摆脱了cors问题。

修改

你可以创建这样的东西:

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;

然后在你的nodejs服务器文件上添加它,如下所示:

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

然后从客户端而不是SpringBoot服务调用它。