3

私のAngularアプリには$http、サーバーからデータを取得するために利用するサービスがあります。サーバー エンドポイントは HMAC 認証を使用し、クエリ文字列パラメーターが URL で特定の順序になっていることを期待します。

Angular$httpは URL を作成するときにパラメーターを並べ替えるため、カスタム パラメーターの順序を指定することはできないようです。

次に例を示します。

this.apiCall = function() {
    return $http({
        method: 'GET',
        url: 'http://example.com/url/v1/endpoint',
        params: {
            'c': 'cdata',
            'a': 'adata',
            'b': 'bdata'
        }
    });
};

Angular は として URL を構築しますがhttp://example.com/url/v1/endpoint?a=adata&b=bdata&c=cdata、指定されたようにパラメーターの順序を保持する必要がありますhttp://example.com/url/v1/endpoint?c=cdata&a=adata&b=bdata

パラメータを URL 文字列に手動で追加することもできますが、それはあまり友好的ではなく、$httpインターセプターで簡単に管理することはできません。

ECMAScript ではオブジェクトの順序が指定されていないため、Angular はおそらくパラメーターを並べ替えて、ブラウザーの実装全体で均一な動作を維持します。

いずれにせよ、パラメータを指定どおりに保持する URL を作成するために、パラメータをソートするデフォルトの Angular 動作を回避する方法を知っている人はいますか?

4

2 に答える 2

3

私はあなたのソリューションを改善して、より合理化され、動作が保証されたものを作成しました:

$httpProvider.interceptors.push(function() {
    return {
        request: function (config) {
            if (!config.paramOrder) {
                return config;
            }

            // avoid leaking config modifications
            config = angular.copy(config, {});

            var orderedParams = [];
            config.paramOrder.forEach(function (key) {
                if (config.params.hasOwnProperty(key)) {
                    orderedParams.push(encodeURIComponent(key) + '=' + encodeURIComponent(config.params[key]));
                    // leave only the unordered params in the `params` config
                    delete config.params[key];
                }
            });

            config.url += (config.url.indexOf('?') === -1) ? '?' : '&';
            config.url += orderedParams.join('&');

            return config;
        },
    };
});

次のように呼び出します。

$http({
    method: 'GET',
    url: 'http://example.com/url/v1/endpoint',
    params: {
        a: 'aValue',
        b: 'bValue',
        c: 'cValue'
    },
    paramOrder: ['c', 'a']
});

key で始まり、cその後に が続くクエリ文字列を取得しますa。に記載されていないパラメータはparamOrder、順序付けされたパラメータの後に追加されます (アルファベット順)。

于 2014-11-25T19:29:05.477 に答える