2

RESTFULファイルAPIに接続する一種のファイルマネージャーアプリケーションに取り組んでいます。angular アプリでは、各ファイルとディレクトリは$resource、 file-object プロパティrelativePathNameを resource id として使用する angular のインスタンスです。

js var File = $resource(url + '/:type/:id', {id: '@relativePathName', type: '@type'}, {…});

問題は、ファイル リソースを更新するときに、relativePathNameパラメーターがエンコードされた URL を取得することです。たとえば、サーバーが実際の API に到達する前にリクエストを傍受するように/なり%2Fます (サーバーはこれを物理アドレスとして扱い、404 応答を返すと仮定します)。 . API は URL セグメント全体を 1 つのパラメーターとして扱うことができるため、基本的には別の uri としてではなくpath/to/file、の uri パラメーターとして扱いますhttp://myapp.com/api/files/create/path/to/file

私の質問は、リソース コンストラクター内のプライベート Router インスタンスによって生成された後に、リクエスト URL を変更する方法はありますか? もしそうなら、どのように(ドキュメントでこれについて何も見つかりませんでした)?. 可能な解決策は何ですか?relativePathNameリソース ID として宣言するのではなく、パラメーターとして渡す(API の変更が必要になる) ?

前もって感謝します。

トーマス

4

3 に答える 3

1

$resource の使用は、RESTful サービス呼び出しのワンストップ ショップではなく、特定の方法で構造化された API の便利なサービスにすぎません。$resource が必要なことを実行できない場合は、呼び出す API に適合する $resource と $http を組み合わせて独自のサービスを作成してください。

于 2013-10-19T17:05:35.890 に答える
0

このアプリでは、getByName リクエストに別の URL が必要だったので、次のようにアクション getByName の URL パラメータでリソース アドレスをオーバーライドします。

myapp.factory('ListGroup', ['$resource',
     function($resource) {

        return $resource(
            '/API/List/:Id',
            {
                Id:'@Id',
                Name:'@Name'
            },
            {
                getByName: {method: 'GET', url: '/API/List/Group/:Name', isArray: true}
            }
        );
}

]);

于 2014-03-24T17:02:21.857 に答える
0

私の質問は、リソース コンストラクター内のプライベート Router インスタンスによって生成された後に、要求 URL を変更する方法はありますか?

リソースコンストラクターの内部についてはわかりませんが、インターセプターを使用して、$resource によって生成された後にルート URL をプログラムで変更できます。

構造

hooks.config.js
hooks.factory.js
hooks.module.js

hooks.module.js

module.exports = angular
                    .module("app.hooks", [])
                    .factory("hooks", require("./hooks.factory.js"))
                    .config(require("./hooks.config.js"));

hooks.config.js

module.exports = ["$httpProvider", function($httpProvider) {
    $httpProvider.interceptors.push("hooks");
}];

hooks.factory.js

module.exports = ["$q", "$location", function($q, $location) {

    var basePrefix = "/api/v1";

    return {
        //invoked on every http request
        request: function(request) {
            request.url = interpret(request.url);
            return $q.when(request);
        }
    };

    function interpret(str) {
        //if requesting an html template, don't do anything
        if (str.indexOf(".html") > -1)
            return str;
        //if you're accessing the api, append the base prefix globally here
        else
            return basePrefix + str;
    }
}];
于 2015-12-29T06:35:38.963 に答える