我希望弄清楚为什么在Firefox中运行的React应用程序中的API请求失败。
标题如下:
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection keep-alive
DNT 1
Host backend:8080
origin http://localhost:3000
Referer http://localhost:3000/
User-Agent Mozilla/5.0 ...
在Chrome上,不透明的消息表明某种网络错误:
request.js?176a:41 GET http://backend:8080/api/foobar/
net::ERR_NAME_NOT_RESOLVED
在Firefox上,似乎还有更多信息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://backend:8080/api/foobar/. (Reason: CORS request did not succeed).
我有一个由两个相关节点frontend
和backend
组成的环境。 frontend
正在运行托管React frontend
位的服务器。 backend
是Flask应用,提供了一组简单的JSON API。目的是让frontend
通过JSON API调用backend
。
docker-compose
配置使它们在同一逻辑网络上运行。最初,我怀疑这个问题是docker-compose
问题,也许是一些DNS事故。但是,通过手动停止frontend
节点并手动将同一容器重新连接到网络,我能够排除这种情况,因此我可以运行bash
shell并ping backend
主办。此外,我还可以通过curl
从backend
获取相同的位。因此,这不属于Docker网络问题(我认为)。
下一个逻辑元凶与CORS有关。 frontend
请求到达了一个不同的域(例如backend
),因此可以解释该行为。
在docs listed in the dev console of Firefox之后,声称发生了“某种基本网络错误”。
出于良好的考虑,我在backend
上设置了Flask-CORS,并验证了正确的标头正在从服务器中继。确切地说,Access-Control-Allow-Origin: *
。
但是,从backend
服务器的日志来看,仍然没有新的网络请求。我已经推测,根据Mozilla CORS Docs中描述的特殊情况,也许有一个OPTION
请求被向backend
触发,但是失败了。但这至少会触发Flask控制台输出中的日志条目,表明已触发OPTION
请求。为了沉迷于妄想症,我什至爆发了Wireshark。甚至没有从Firefox(或Chrome)发出任何相关的网络请求!
奇怪的是,我为此感到复杂,这很简单。但是会喜欢一些朝着正确方向发展的指针。