我正在运行一个本地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
我试图在我的请求中模仿这个标题,但不确定它有何不同?任何帮助都将非常感激,因为我正在用这个方式撞击我的方式!
答案 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服务调用它。