Skip to content

浏览器限制

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服务通信