浏览器限制
Node-App生成的网页应用在浏览器中运行,必然受浏览器运行环境的限制。出于安全性考虑,浏览器会限制脚本发起的跨源请求。如果你的应用需要调用第三方接口(如天气API)、发送HTTP指令、创建WebSocket连接、连接到MQTT Broker等。那么,这一章节的内容很重要。否则,可以先跳过本章节。
跨源资源共享 CORS
所谓“跨源”是指请求的双方具有(任一)不同的协议(protocol)、域(domain)或端口(port)。例如Node-App创建的应用 myapp 的URL地址为https://nodematrix.cn/myapp
。其中,https
为协议,nodematrix.cn
为域,端口为https默认端口443
。当 myapp 中的JavaScript要调用第三方网站的接口,例如https://weatherapi.com
天气查询接口时,由于双方属于不同的域,这就是跨源请求。
默认情况下,浏览器会阻止跨源请求,除非接收请求的一方(服务方)明确允许跨源访问。这种允许跨源访问的协议,称为跨源资源共享协议(CORS Protocol)。https://weatherapi.com
天气查询接口支持CORS协议,因此,myapp 可以正常访问该接口。
具体来说,服务方通过在返回的响应头(Response header)中添加标识Access-Control-Allow-Origin: *
告知浏览器允许跨源访问。如果 myapp 要访问的是具有网络接口的自定义硬件,比如ESP32模块。那么,在固件返回的HTTP响应头中也应该添加Access-Control-Allow-Origin: *
来允许跨源访问。
JSONP
CORS协议在2014年成为W3C标准,在此之前,跨源访问并没有官方标准。JSONP(JSON with Padding)是一个非官方的约定方案,其利用浏览器允许跨源加载脚本的特性,间接绕过了跨源访问限制。JSONP需要双方约定,是CORS之前的常规跨源方案。
Node-App工具箱Network分类中的 http GET 块支持JSONP跨源请求。
JSONP实现方式:w3schools.com/JSONP
HTTP与HTTPS
除了默认的跨源限制,浏览器对其中的跨协议请求有更严格的限制。浏览器会阻止 HTTPS 协议的页面脚本访问 HTTP 资源(即使在响应头添加了Access-Control-Allow-Origin: *
),例如发起HTTP请求、进行WebSocket连接等。而对于 HTTP 协议的页面脚本访问 HTTPS 资源,浏览器一般不作限制,但会在控制台输出告警信息。
基于安全考虑,建议通信双方都应该采用 HTTPS 协议。Node-App的应用默认发布为 HTTPS 协议的URL。
某些硬件可能因为资源或固件限制,只能提供 HTTP 接口。当应用以 HTTPS 协议打开时,将无法访问 HTTP 接口。可以通过 HTTP 协议(例如http://nodematrix.cn/myapp
)打开应用,使其可以访问 HTTP 接口。考虑这种情况一般出现在私有的局域网内,算是一个可接受的折衷方案。
应用案例:与ESP32的HTTP服务通信