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

时间:2019-05-20 09:02:35

标签: apama

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

谢谢 Mathias

1 个答案:

答案 0 :(得分: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的运行配置中手动定义相同的环境变量,以便在那里也可以使用它们。