使用Appcelerator Titanium在JSON中选择特定节点



希望这是一个简单的问题。

我有一个来自Rackspace的API服务,我调用它,最近他们改变了一些响应的顺序,这意味着我的应用程序的一部分将不再上传图像到正确的POST url。

我已经通过硬编码它应该发布的URL来临时修复,但我想确保我将来能够证明API顺序的任何变化或URL本身的任何变化。

所以,最初我使用JSON响应并选择第一个节点及其子节点。

var CFtenantID = getRSToken.access.serviceCatalog[0].endpoints[0].tenantId;
var CFregion = getRSToken.access.serviceCatalog[0].endpoints[0].region;
var CFpublicURL = getRSToken.access.serviceCatalog[0].endpoints[0].publicURL;

现在,该节点已经移动到长列表中的第18个位置。因此,我可以手动设置脚本来检索它。

   var CFtenantID = getRSToken.access.serviceCatalog[17].endpoints[0].tenantId;
   var CFregion = getRSToken.access.serviceCatalog[17].endpoints[0].region;
   var CFpublicURL = getRSToken.access.serviceCatalog[17].endpoints[0].publicURL;

我想要能够做的是扫描"名称",而只是返回我需要的CloudFiles信息,而不必声明数组的实际数量。

下面是Rackspace的JSON响应片段。

{
                "name": "cloudFeeds",
                "endpoints": [
                    {
                        "region": "LON",
                        "tenantId": "1234",
                        "publicURL": "https://lon.feeds.api.rackspacecloud.com/1234",
                        "internalURL": "https://atom.prod.lon3.us.ci.rackspace.net/1234"
                    }
                ],
                "type": "rax:feeds"
            },
            {
                "name": "cloudFiles",
                "endpoints": [
                    {
                        "region": "LON",
                        "tenantId": "MossoCloudFS_xxxxxx",
                        "publicURL": "https://storage101.lon3.clouddrive.com/v1/MossoCloudFS_xxxxx",
                        "internalURL": "https://snet-storage101.lon3.clouddrive.com/v1/MossoCloudFS_xxxxx"
                    }
                ],
                "type": "object-store"
            },
            {
                "name": "cloudFilesCDN",
                "endpoints": [
                    {
                        "region": "LON",
                        "tenantId": "MossoCloudFS_xxxxxx",
                        "publicURL": "https://cdn3.clouddrive.com/v1/MossoCloudFS_xxxxxx"
                    }
                ],
                "type": "rax:object-cdn"
            }

这是我在Appcelerator中的整体脚本。

var authCloudFiles = Ti.Network.createHTTPClient({
                    onload: function() {
                        // output
                        Ti.API.info(this.responseText);
                        var getRSToken = JSON.parse(this.responseText);
                        var rsToken = getRSToken.access.token.id;
                        var rsTenantID = getRSToken.access.token.tenant.id;
                        var rsTenantName = getRSToken.access.token.tenant.name;
                        var CFtenantID = getRSToken.access.serviceCatalog[17].endpoints[0].tenantId;
                        var CFregion = getRSToken.access.serviceCatalog[17].endpoints[0].region;
                        var CFpublicURL = getRSToken.access.serviceCatalog[17].endpoints[0].publicURL;
                        var rsUserID = getRSToken.access.user.id;
                        Ti.App.Properties.setString('rsToken', rsToken);
                        Ti.App.Properties.setString('rsTenantID', rsTenantID);
                        Ti.App.Properties.setString('rsTenantName', rsTenantName);
                        Ti.App.Properties.setString('CFtenantID', CFtenantID);
                        Ti.App.Properties.setString('CFregion', CFregion);
                        Ti.App.Properties.setString('CFpublicURL', CFpublicURL);
                        Ti.App.Properties.setString('rsUserID', rsUserID);
                        //alert(rsToken);
                        Ti.API.info('rsToken: ' + rsToken);
                        Ti.API.info('rsTenantID: ' + rsTenantID);
                        Ti.API.info('rsTenantName: ' + rsTenantName);
                        Ti.API.info('CFtenantID: ' + CFtenantID);
                        Ti.API.info('CFregion: ' + CFregion);
                        Ti.API.info('CFpublicURL: ' + CFpublicURL);
                        Ti.API.info('rsUserID: ' + rsUserID);
                        // then we need to load the next step
                        rackspaceUpload();
                    }
                });
                authCloudFiles.open('POST', 'https://identity.api.rackspacecloud.com/v2.0/tokens');

有人能帮忙吗?

西蒙

我以前从未使用过Appcelerator Titanium,但它看起来就像JavaScript。

您可以尝试替换以下内容:

var CFtenantID = getRSToken.access.serviceCatalog[17].endpoints[0].tenantId;
var CFregion = getRSToken.access.serviceCatalog[17].endpoints[0].region;
var CFpublicURL = getRSToken.access.serviceCatalog[17].endpoints[0].publicURL;

:

var CFtenantID = "";
var CFregion = "";
var CFpublicURL = "";
var catalog = getRSToken.access.serviceCatalog;
for (var i=0; i<catalog.length; i++) {
  if (catalog[i].name == "cloudFiles") {
    for (var j=0; i<catalog[i].endpoints.length; j++) {
      if (catalog[i].endpoints[j].region == "LON") {
        CFtenantID = catalog[i].endpoints[j].tenantId;
        CFregion = catalog[i].endpoints[j].region;
        CFpublicURL = catalog[i].endpoints[j].publicURL;
        break;
      }
    }
  }
}

我的JavaScript有点生疏,你可能想添加一些额外的错误处理

相关内容

  • 没有找到相关文章

最新更新