0

希望对你来说是一个简单的问题。

我有一个来自 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');

任何人都可以帮忙吗?

西蒙

4

1 回答 1

0

我以前从未使用过 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 有点生疏,您可能需要添加一些额外的错误处理。

于 2015-09-18T23:35:34.837 回答