我希望从 Camunda 使用 Javascript 执行的 BPMN 模型中的脚本任务中发送 HTTP 请求。有谁知道该怎么做吗?
我已经测试过了:
var xmlhttp;
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "http://test.local/append.php", true);
xmlhttp.send();
但是一旦进入包含上述代码的脚本任务,
Tasklist
提示找不到XMLHttpRequest
。
根据您的 Java 版本,您可以使用 Rhino(Java 7 之前)或 Nashorn(Java 8 开始)Javascript 引擎。两者都没有 XmlHttpRequest 的概念,正如您从 Web 浏览器中的 Javascript 引擎中了解到的那样。所以你必须使用一个允许你发送 HTTP 请求的库。这个Post链接了Rhino的XmlHttpRequest实现。
Camunda 使用的 Nashorn JavaScript 引擎可能不支持
XmlHttpRequest
本身,但它支持 Java“互操作”,因此您可以在 JavaScript 中实例化和使用 Java 类,并按照您的方式发送 HTTP 请求在爪哇。例如,如果您只想使用默认的 Camunda docker 映像而无需在服务器端自定义或安装任何内容,则这特别有用:
// HttpClient version (Java 11+)
// get Java types
var HttpClient = Java.type("java.net.http.HttpClient");
var HttpRequest = Java.type("java.net.http.HttpRequest");
var HttpResponse = Java.type("java.net.http.HttpResponse");
var URI = Java.type("java.net.URI");
// create JSON object
var data = {
activityInstanceId: execution.getActivityInstanceId(),
currentActivityInstanceId: execution.getCurrentActivityId()
};
var jsonData = JSON.stringify(data);
// create request
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("http://10.0.0.5:9090/notify"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.build();
// fire and forget
client.send(request, HttpResponse.BodyHandlers.ofString());
请参阅 Java 11
HttpClient
文档 和 Nashorn Java API 了解更多信息。同样,您可以在旧平台上使用 URLConnection
,甚至只是打开 TCP 套接字。