【问题标题】:Using RHINO js engine to make http requests使用 RHINO js 引擎发出 http 请求
【发布时间】:2014-04-05 03:49:09
【问题描述】:

我正在尝试使用 Mozilla/Rhino js 引擎在命令行中测试一些 SOAP 请求。但是,用于发出请求的普通对象(XMLHttpRequest、HttpRequest)似乎都不可用。为什么是这样?我可以导入库吗?

【问题讨论】:

  • none of the normal objects for making requests (XMLHttpRequest, HttpRequest) 正常在哪里?你认为犀牛是什么? JAVASCRIPT 不是 DOM ! XMLHttpRequest 是一个 DOM API,它与 javascript 无关,它不是 Javascript 规范的一部分,javascript 引擎不必实现 DOM,Rhino 不需要。
  • 公平地说,假设安装了数十亿个 javascript 实现,包括每个现代 Web 浏览器,其中大多数开发人员会安装四到五个,而大多数计算机至少会安装其中,90% 或更多的人拥有 DOM。因此,可以公平地说,当您使用 Javascript 时,OP 提到的对象“通常”可用。这不是一个不常见的混淆点,可以轻轻纠正。

标签: javascript rhino


【解决方案1】:

我能够使用 Rhino 和以下代码使其工作。

var post = new org.apache.commons.httpclient.methods.PostMethod("https://someurl/and/path/");
var client = new org.apache.commons.httpclient.HttpClient();

// ---- Authentication ---- //
var creds = new org.apache.commons.httpclient.UsernamePasswordCredentials("username", "password");
client.getParams().setAuthenticationPreemptive(true);
client.getState().setCredentials(org.apache.commons.httpclient.auth.AuthScope.ANY, creds);
// -------------------------- //

post.setRequestHeader("Content-type", "application/xml");
post.setRequestEntity(new org.apache.commons.httpclient.methods.StringRequestEntity(buildXML(), "text/plain", "ASCII" ));

var status = client.executeMethod(post);
var br = new java.io.BufferedReader(new java.io.InputStreamReader(post.getResponseBodyAsStream()));
var response = "";
var line = br.readLine();
while(line != null){
    response = response + line;
    line = br.readLine();
}

post.releaseConnection();

【讨论】:

  • 这不是将 js 移植到 java 而在 js 中编写代码。但是谢谢
【解决方案2】:

我实际上能够使用带有“可编写脚本任务”对象的 Orchestrator 5.1 来与 Zabbix API 交互:

var urlObject = new URL(url);
var jsonString = JSON.stringify({ jsonrpc: '2.0', method: 'user.login', params: { user: 'username', password: 'password' }, id: 1 });

urlObject.contentType = "application/json";
result = urlObject.postContent(jsonString);

System.log(result);

var authenticationToken = JSON.parse(result).result;

【讨论】:

    【解决方案3】:

    您可能会找到要导入的库,也可以用 Java 编写自己的库,并根据您的使用方式将它们提供给您的 rhino 实例。请记住,Rhino 只是一个 Javascript 语言引擎。它没有 DOM,可以说本身就不是“网络感知”。

    但是,由于听起来您这样做是为了测试/实验目的,而且您可能会更有效率,而不必重新发明轮子来这样做,我强烈建议您下载 Node.js 和查看request module(用于发出HTTP请求)或any of the various SOAP modules

    您可以使用 Node.js 做更多事情,但您也可以将它用作 Javascript 文件的非常简单的运行器。无论如何,您都应该远离 Rhino。它真的很老了,不再被真正支持了,尤其是现在有了 JDK8,甚至 javax.script 支持都将切换到 Nashorn 引擎。

    更新:如果您真的想尝试一下(并且如果您准备好使用 Java),您可以查看 this SO question 及其答案。但除非你是一个受虐狂,否则我认为你会更乐意走不同的道路。

    【讨论】:

    • 我实际上是在寻找这个,因为我正在尝试从 VMWARE 的 vCenter Orchestrator 进行 SOAP 调用,并且源使用其 SOAP 插件不支持的 WSDL 格式。 VCO 提供了一个 Rhino JS 引擎,因为它是脚本引擎,所以我想我可以通过这种方式绕过它,但似乎没有。
    • 我第一次没有完全阅读您的评论。唔。通过查看他们的插件,不幸的是只提供“更高级别”的插件。您应该联系他们的支持,看看他们是否会只提供一个 HTTP 而不是只提供专用的 SOAP 和 REST 插件。
    • 顺便说一句,也许除了传统的支持之外,您还可以看看他们的“实验室”人员是否会做出任何回应。这似乎是他们抛出不受支持的小部件的地方 - 也许有人可以帮您一个忙。 VMWare Labs
    • 那么有没有办法使用纯javascript(没有DOM)来发出http请求?
    • 没错。作为一种简化,全局对象 Mozilla lists here 是您可以访问的所有对象(我说是简化,因为我不相信 Rhino 支持“实验室”对象)。
    猜你喜欢
    • 2023-03-30
    • 2014-05-25
    • 1970-01-01
    • 2011-06-04
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多