2015-09-18 2 views
0

Надеюсь, вам будет легко задать вопрос.Выбор конкретного узла в 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'); 

Может ли кто-нибудь помочь?

Simon

ответ

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

Смежные вопросы