从浏览器端JavaScript到IBM MQ on Cloud的REST调用的“跨域请求被阻止”

问题描述

我正在尝试将REST调用发送到Cloud上的IBM MQ到队列中的PUT和GET消息。我想在浏览器端JavaScript中执行此操作,但收到“跨域请求被阻止”错误消息。 我的首选是让客户端浏览器代码发送消息,但是我将选择服务器端的Node.js代码发送消息。

解决方法

从浏览器直接向IBM MQ on Cloud发送消息

由于CORS被阻止,这是不可能的,但是有一种解决方法。

从本质上说,为防止在用户无法控制的情况下滥用API,您的浏览器将阻止您访问其他站点的资源,除非该站点特别允许使用Access-Control-Allow-Origin标头从您的站点访问它们(值*中的可以用于允许从所有站点进行访问。

IBM MQ on Cloud的REST API不允许CORS,也不允许您修改任何Web Console或REST API属性,这意味着您不能直接从浏览器向IBM MQ on Cloud发送消息。

从浏览器使用REST API常常不是一个好主意,这是因为它鼓励开发人员在其浏览器端JavaScript代码中分发凭据,这是一个不良的安全实践。

此方法的解决方法是让浏览器客户端向您的服务器发出请求,您将服务器配置为代表服务器将消息发送到IBM MQ on Cloud。这使您可以完全控制将哪些消息发送到队列,这有其自身的优势。

从Node.js服务器向IBM MQ on Cloud发送消息

您可能希望使用ibmmq npm软件包来为您处理所有事情。 https://www.npmjs.com/package/ibmmq

如果您不想使用该程序包,则可以使用自己喜欢的请求程序包,并使用诸如GET https://web-qmanager-example.qm.us-south.mq.appdomain.cloud/ibmmq/rest/v1/login之类的调用来调用API。

即使使用服务器端Node.js代码,您可能仍然会遇到CORS请求被阻止的错误消息的问题。多年以前的经验,我一直努力使jQuery在后端应用程序中运行以忽略CORS检查,此问题很可能自此已得到解决,但其他一些npm软件包也可能存在类似问题。 如果遇到这些问题,可以尝试以下几种方法。首先检查所用软件包的文档,可能需要启用跳过CORS检查选项。下一个选择是尝试使用其他程序包来处理REST调用。最后的选择是用另一种编程语言编写一个简单的代理,例如使用http.server在Python中编写。