Выбор конкретного узла в JSON с помощью Appcelerator Titanium

Надеюсь, простой вопрос для вас.

У меня есть служба API от Rackspace, которую я вызываю, недавно они изменили порядок некоторых ответов, что означает, что часть моего приложения больше не будет загружать изображения на правильный URL-адрес POST.

Я установил временное исправление путем жесткого кодирования 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 вместо того, чтобы объявлять фактический номер массива.

Вот фрагмент ответа JSON от Rackspace.

{
                "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');

Кто-нибудь может помочь?

Саймон

1 ответ

Я никогда раньше не использовал 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 немного ржавый, вы можете добавить дополнительную обработку ошибок.

Другие вопросы по тегам