apama - 来自 Cumulocity 中内置 Apama 运行时的 HTTP 请求的凭据
问题描述
我正在使用 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;
}
}
}
使用此配置(用户和密码注释)我得到以下打印语句:
请求失败。响应状态为:401 | 未经授权
启用用户和密码后,请求成功执行。但是,我不想在这里硬编码用户和密码。
另外,有没有办法从环境变量或类似的东西中获取当前租户,这样我就不必对基本 URL 进行硬编码?
谢谢马蒂亚斯
解决方案
是的,可以这样做,因为 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 传输一起使用时执行相同操作或在本地测试代码,而不更改代码,您可以在 Designer 的运行配置中手动定义相同的环境变量,以便它们在那里也可用.
推荐阅读
- angular - 可取消组件@Ouput EventEmitter?
- android - 项目创建时 Intellij Android Support 插件异常
- java - JShell - 防止输入键执行 Java 语句或如何设置语句分隔符
- javascript - HEAD xhr 后的重定向
- javascript - 删除包含对象数组的外部数组,javascript
- r - 使用 sqldf 删除列中的前两个字符
- javascript - 获取一个 id 数组,其中选择器是一个类
- sql - 用于获取输出的 SQL 查询,如共享示例中所示
- build - 将 protobuf 库构建为静态库
- python - 使用可重定位 virtualenvs 时,我应该期待哪些故障模式?