首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自Cumulocity中内置Apama运行时的HTTP请求的凭据

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

Stack Overflow用户
提问于 2019-05-20 17:02:35
回答 1查看 96关注 0票数 2

我使用的是Apama v10.3.1。我使用的是Cumulocity安装的内置Apama容器,我上传的只是一个监视器,而不是整个Apama项目。在我的Apama监视器中,我正在对Cumulocity REST API执行HTTP GET请求,以获取我的监视器处理所需的其他参数。

我的问题是,在执行HTTP请求时,我需要提供一个用户和密码,否则我会得到一个401错误。由于我不想在我的监视器中硬编码用户和密码,有没有办法使用内置的Apama容器用于与Cumulocity通信的凭据?由于Apama在幕后与Cumulocity通信,以交换事件、度量等,因此我假设在某个地方有可用的凭据。是这样的吗?如果是这样,我如何告诉我的Apama监视器使用这些凭据?

以下是代码的摘录:

代码语言:javascript
复制
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了?

谢谢马蒂亚斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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上查看环境变量列表

因此,对于您的用例,如下所示将会起作用:

代码语言:javascript
复制
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传输时执行相同的操作或在本地测试代码,而不更改代码,则可以在设计器的运行配置中手动定义相同的环境变量,以便它们在那里也可用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56217561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档