34

私の API では、API 呼び出しの末尾にスラッシュが必要です。angularでそれをやってのける方法を考えていました。

したがって、アクセスできるようにする必要がある/tasks/か、/tasks/xxxx/. 次の方法でアクセスしようとしました:

angular.module('taskServices', ['ngResource']).
        factory('Tasks', function($resource){
            return $resource('/tasks/:task_id/', {}, {
                 query: {method:'GET', 
                         params:{},
                         isArray:true}
            });
 });

そして

$scope.tasks = Tasks.query(); 

ただし、結果は/tasksまたはtasks/xxxクエリになります。

/tasks/どうすればそれを常に強制できますか/tasks/xxx/

4

9 に答える 9

65

これは修正されたようです: https://github.com/angular/angular.js/pull/5560

次のように構成できます。

app.config(function($resourceProvider) {
  $resourceProvider.defaults.stripTrailingSlashes = false;
});
于 2014-06-10T13:02:02.790 に答える
35

AngularJS ソース コードのこの行では、末尾のスラッシュが明示的に削除されています。このコードの背後にある理論的根拠は完全にはわかりませんが、これに対してすでに問題が開かれています: https://github.com/angular/angular.js/issues/992

上記の問題で述べたように、$resourceファクトリは特定の仕様に準拠する RESTful エンドポイントに最適です。は、この$resource仕様に準拠するバックエンドとの対話には優れた仕事をしますが、$resource. $httpこのような場合、次の質問に記載されているように、下位レベルのサービスの使用に切り替えるのが最善の方法です:サーバーからデータを取得する推奨される方法

$httpは非常に強力で柔軟なサービスであり、URL や送信されるパラメーターなどを完全に制御できます。

于 2013-01-26T11:19:20.307 に答える
20

URLテンプレートの最後にスペースを追加すると、ここで機能します(角度1.2.0でテスト済み):

{url: '/user/:id/ '}
于 2013-10-19T06:49:44.617 に答える
6

URL の末尾のスラッシュをエスケープするために 2 つのバックスラッシュを追加すると、Chrome と Safari でうまくいきました。

ただし、Firefox は、URL から末尾のスラッシュを削除し、スラッシュをエスケープしていたバックスラッシュを %5C にエンコードすることをお勧めします...すばらしい :-) したがって、上記の例では、http://exampleを取得します。 .com/controller/save%5C、サーバーで 404s します。

私は自分のプロジェクトに Django+TastyPie を使用しており、URL の末尾にスラッシュが必要です。最小公分母としてすべてを $http にドロップダウンするのではなく、ngResource を変更しようとしています。

于 2013-05-21T09:12:07.970 に答える
2

django-rest-frameworkを使用する AngularJS クライアントの場合は、単にangular-django-rest-resource を使用してください。うまくいきました。

于 2014-04-08T10:55:40.153 に答える
0

最終的な URL を作成する前に、これを ngResource に追加することで、Firefox のエンコーディングの問題を解決できます。

url = url.replace(/\\/,"/");

これにより、Chrome/Safari のスラッシュ エスケープの修正が Firefox でうまく機能するようになります。

app.factory('Things', function($resource){
        return $resource('/api/v1/thing\\/', {}, {
              query: {method:'GET', params:{},isArray:true}});
        }); 
于 2013-08-13T20:48:30.233 に答える
0

AngularJS ソースが変更されるまでの回避策として、.htaccess 書き換えルールを設定して、Web サーバーへのすべての着信要求に末尾のスラッシュを追加しました。

RewriteCond %{REQUEST_URI} !(/$|\.)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]

このアプローチの欠点:

  • RESTful 呼び出しのネットワーク トラフィックが 301 リダイレクトされるため、リクエストが 2 回送信される
  • これは GET リクエストに対してのみ機能します (私の例の制限に注意してください)。リライトが POST、DELETE、PUT リクエストおよびリダイレクトを受け取る場合、同じ URL の GET リクエストとして行われます。ペイロードを失うからです。
于 2013-07-02T00:46:47.193 に答える
-2

Vincent の末尾のスラッシュのエスケープ (URL の末尾に 2 つのバックスラッシュとスラッシュ (http://example.com/controller/save\\/) を追加) はうまくいきました。

于 2013-05-20T22:26:16.730 に答える