2

我正在使用 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 进行硬编码?

谢谢马蒂亚斯

4

1 回答 1

3

是的,可以这样做,因为 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 的运行配置中手动定义相同的环境变量,以便它们在那里也可用.

于 2019-05-20T13:45:19.233 回答