来自 Cumulocity 中内置 Apama 运行时的 HTTP 请求的凭证

Credentials for HTTP requests from built-in Apama runtime in Cumulocity

我正在使用 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 的 运行 配置中手动定义相同的环境变量,以便它们那里也有。