258

呼び出したい Web サービスがいくつかあります。$resourceまたは$http、どちらを使用すればよいですか?

$resource: https://docs.angularjs.org/api/ngResource/service/$resource

$http: https://docs.angularjs.org/api/ng/service/$http

上記の 2 つの API ページを読んだ後、道に迷ってしまいました。

どのような違いがあり、どのような状況で使用すればよいのか、平易な英語で説明していただけますか? これらの呼び出しを構造化し、結果を js オブジェクトに正しく読み込むにはどうすればよいですか?

4

10 に答える 10

170

$http汎用AJAX用です。ほとんどの場合、これを使用します。、、タイプの呼び出しを手動で行い、それらが返すオブジェクトを自分で処理します$httpGETPOSTDELETE

$resource$httpRESTful Web API シナリオで使用するためのラップ。


GET非常に一般的に言えば、RESTful Web サービスは、POSTPUTDELETE、 などのHTTP メソッドに基づいて、そのデータ型でさまざまなことを行うデータ型の 1 つのエンドポイントを持つサービスになります$resourceGETJavaScript オブジェクトとして、それを変更して で送り返すPOSTか、 で削除することさえできDELETEます。

...それが理にかなっている場合。

于 2012-11-01T17:07:27.763 に答える
41

$http汎用の AJAX 呼び出しを行います。これは一般的に、 RESTful API とRESTful APIを含めることができることを意味します。

そのRESTful部分に$resource特化しています。

プログラマーが作成したランダムな URL ではなく、URL がより適切に編成されているため、 Restful Apiが近年普及するようになりました。

RESTful APIを使用して URL を作成すると、次のようになります/api/cars/:carId

$resourceデータを取得する方法

angular.module('myApp', ['ngResource'])

    // Service
    .factory('FooService', ['$resource', function($resource) {
        return $resource('/api/cars/:carId')
    }]);

    // Controller
    .controller('MainController', ['FooService', function(FooService){
        var self = this;
        self.cars = FooService.query();
        self.myCar = FooService.get('123');

    }]);

これにより、、、、メソッドが自動的に付随するリソース オブジェクトが得られます。getsavequeryremovedelete

$httpデータを取得する方法

angular.module('myApp', [])

    // Service
    .factory('FooService', ['$http', function($http){
        return {
            query: function(){
                return $http.get('/api/cars');
            },

            get: function(){
                return $http.get('/api/cars/123');
            }
            // etc...
        }

RESTFul APIで各共通操作をどのように定義する必要があるかを確認してください。また、1 つの違いは、 returnがオブジェクトを$http返すpromise間です。Angular が restangularのようなRESTFul API$resourceを処理するのに役立つサードパーティのプラグインもあります。


APIがのようなものである場合/api/getcarsinfo。あとは を使用するだけ$httpです。

于 2015-08-08T00:29:21.440 に答える
30

答えは、コードを書いている時点であなたが誰であるかに大きく依存すると思います。Angular を初めて使用する$http場合は、必要な理由がわかるまで使用してください$resourceがどのようにあなたを妨げているかを具体的に経験し、コードで を使用することの意味を理解するまでは$httpに固執してください。$resource$http

これは私の経験でした。私は最初の Angular プロジェクトを開始しました。RESTful インターフェイスに対して HTTP リクエストを行う必要があったため、あなたが現在行っているのと同じ調査を行いました。このようなSOの質問で読んだ議論に基づいて、私は$resource. これは、元に戻したい間違いでした。理由は次のとおりです。

  1. $http例は豊富で役に立ち、通常は必要なものだけです。明確$resourceな例はほとんどなく、(私の経験では) 必要なものがすべて揃っていることはめったにありません。Angular の初心者にとっては、後になってドキュメントに頭を悩ませ、役立つ$resource例が見つからないことに腹を立てるまで、選択の意味に気付かないでしょう。
  2. $httpおそらく、探しているものへの 1 対 1 のメンタル マップです。で何が得られるかを理解するために、新しい概念を学ぶ必要はありません$http$resourceあなたがまだメンタルマップを持っていない多くのニュアンスをもたらします.
  3. おっと、新しい概念を学ぶ必要はないと言いましたか? Angular の初心者として、Promiseについて学ぶ必要があります。$httpPromise を返し、それが.thenできるので、Angular と Promise について学んでいる新しいこととうまく適合します。$resourcePromise を直接返さないため、Angular の基礎に関する暫定的な把握が複雑になります。
  4. $resourceRESTful CRUD 呼び出しのコードと入出力の変換が凝縮されているため、強力です。自分の結果を処理するコードを繰り返し書くのにうんざりしているなら、これは素晴らしいことです$http。他の誰にとっても、$resource紛らわしい構文とパラメーターの受け渡しの不可解なレイヤーを追加します。

3 か月前に自分のことを知っていたらよかったのにと思います$http

于 2016-02-04T22:26:38.227 に答える
24

$resource は、生の文字列ではなく、サーバーからの応答としてオブジェクトまたは配列を期待していることを強調することが重要だと思います。したがって、応答として生の文字列 (またはオブジェクトと配列以外のもの) がある場合は、$http を使用する必要があります

于 2014-08-01T12:55:44.040 に答える
7

$httpどちらかを選択する場合、$resource技術的に言えば、正しい答えも間違った答えもありません。本質的に、どちらも同じことを行います。

の目的は$resource、パラメーター値とともにテンプレート文字列 (プレースホルダーを含む文字列) を渡せるようにすることです。テンプレート文字列のプレースホルダーを、オブジェクトとして渡されるパラメーター値に$resource置き換えます。RESTFul データソースは同様の原則を使用して URL を定義するため、これは主に RESTFul データソースとやり取りするときに役立ちます。

何をするか$httpは、非同期 HTTP リクエストを実行することです。

于 2014-05-26T01:34:44.183 に答える
2

$http で $resource を使用するときに気づいたことの 1 つは、.net で Web API を使用している場合です。

$resource は、1 つの目的を実行する 1 つのコントローラーに結び付けられます。

$resource('/user/:userId', {userId:'@id'});

[HttpGet]
public bool Get(int id)
{
    return "value"
}

public void Post([FromBody]string value)
{
}

public void Put(int id, [FromBody]string value)
{
}

public void Delete(int id)
{
}

$http は何でもかまいませんが。URLを指定するだけです。

$http.get - "api/認証"

[HttpGet]
public bool Authenticate(string email, string password)
{
    return _authenticationService.LogIn(email, password, false);
}

それは私の意見です。

于 2015-08-06T02:13:20.887 に答える
0

$resource サービスは現在、promise をサポートしていないため、$http サービスとは明らかに異なるインターフェースを持っています。

于 2016-01-12T12:18:49.510 に答える