我使用的是Apama v10.3.1。我使用的是Cumulocity安装的内置Apama容器,我上传的只是一个监视器,而不是整个Apama项目。在我的Apama监视器中,我正在对Cumulocity REST API执行HTTP GET请求,以获取我的监视器处理所需的其他参数。
我的问题是,在执行HTTP请求时,我需要提供一个用户和密码,否则我会得到一个401错误。由于我不想在我的监视器中硬编码用户和密码,有没有办法使用内置的Apama容器用于与Cumulocity通信的凭据?由于Apama在幕后与Cumulocity通信,以交换事件、度量等,因此我假设在某个地方有可用的凭据。是这样的吗?如果是这样,我如何告诉我的Apama监视器使用这些凭据?
以下是代码的摘录:
monitor SampleAlarmRules {
action onload() {
monitor.subscribe(Alarm.CHANNEL);
monitor.subscribe(FindManagedObjectResponse.CHANNEL);
on all Alarm(type = "ax_UnavailabilityAlarm") as a {
onAlarm(a.source);
}
}
action onAlarm(string source) {
integer reqId := integer.getUnique();
send FindManagedObject(reqId, source, new dictionary<string,string>) to FindManagedObject.CHANNEL;
on FindManagedObjectResponse(reqId = reqId) as resp
and not FindManagedObjectResponseAck(reqId) {
ManagedObject dev := resp.managedObject;
dictionary<string, string> httpConfig := {
HttpTransport.CONFIG_AUTH_TYPE:"HTTP_BASIC"
//HttpTransport.CONFIG_USERNAME:"someUser",
//HttpTransport.CONFIG_PASSWORD:"somePassword"
};
HttpTransport httpTransport := HttpTransport.getOrCreateWithConfigurations("someBaseUrl", 80, httpConfig);
Request request := httpTransport.createGETRequest("/inventory/managedObjects/5706999?withParents=true");
request.execute(handleResponse);
}
}
action handleResponse(Response response) {
JSONPlugin json := new JSONPlugin;
if response.isSuccess(){
switch (response.payload.data as payload) {
case string: {
}
default: {
}
}
}
else {
print "###Request failed. Response status is: " + response.statusCode.toString() + " | " + response.statusMessage;
}
}
}使用此配置(用户和密码已注释),我将获得以下print语句:
请求失败。返回状态: 401 |未授权
启用用户名和密码时,请求执行成功。但是,我不想在这里对用户和密码进行硬编码。
另外,有没有一种方法可以从环境变量或类似的东西中获取当前租户,这样我就不必硬编码基本URL了?
谢谢马蒂亚斯
发布于 2019-05-20 21:45:19
是的,这是可能的,因为Cumulocity将这些作为环境变量传递给所有微服务,包括Apama微服务。
您应该能够使用com.apama.correlator.Component事件来访问环境变量。使用Component.getInfo("envp")获取环境属性的字典,然后查找感兴趣的变量。您可以在http://www.cumulocity.com/guides/reference/microservice-runtime/#environment-variables上查看环境变量列表
因此,对于您的用例,如下所示将会起作用:
using com.apama.correlator.Component;
...
monitor test {
action onload() {
dictionary<string,string> envp := Component.getInfo("envp");
dictionary<string, string> httpConfig := {
HttpTransport.CONFIG_AUTH_TYPE:"HTTP_BASIC",
HttpTransport.CONFIG_USERNAME:envp["C8Y_USER"],
HttpTransport.CONFIG_PASSWORD:envp["C8Y_PASSWORD"]
};
HttpTransport httpTransport := HttpTransport.getOrCreateWithConfigurations("someBaseUrl", 80, httpConfig);
Request request := httpTransport.createGETRequest("/inventory/managedObjects/5706999?withParents=true");
request.execute(handleResponse);
}
}类似地,您可以使用环境变量C8Y_TENANT访问租户名称。
请注意,这些环境变量仅在云中可用。如果您希望在使用自己添加的Cumulocity传输时执行相同的操作或在本地测试代码,而不更改代码,则可以在设计器的运行配置中手动定义相同的环境变量,以便它们在那里也可用。
https://stackoverflow.com/questions/56217561
复制相似问题