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 に答える