web-dev-qa-db-ja.com

AngularJS $ httpおよび$ resource

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

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

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

上記の2つのAPIページを読んだ後、失われました。

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

254
Tom

$httpは汎用AJAX用です。ほとんどの場合、これが使用するものです。 $httpを使用すると、GETPOSTDELETE型の呼び出しを手動で行い、返されるオブジェクトを自分で処理することになります。

$resourceは、RESTful Web APIシナリオで使用するために$httpをラップします。


非常に一般的に言えば、RESTful Webサービスは、GETPOSTPUTDELETEなどのHTTPメソッドに基づいて、そのデータ型でさまざまな処理を行うデータ型の1つのエンドポイントを持つサービスです。したがって、$resourceGETを使用してリソースをJavaScriptオブジェクトとして取得し、それを変更してPOSTで送信するか、DELETEで削除します。

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

166
Ben Lesh

他の答えは正しいですが、質問の根源を十分に説明していないように感じます:RESTHTTPのサブセットです。これは、RESTを介して実行できるすべてがHTTPを介して実行できることを意味しますが、HTTPを介して実行できるすべてがRESTを介して実行できるわけではありません。 $resource$httpを内部的に使用するのはそのためです。

だから、いつお互いを使うのか?

必要なものがRESTのみ、つまりRESTful Webサービスにアクセスしようとしている場合、$resourceを使用すると、そのWebサービスとのやり取りが非常に簡単になります。

代わりに、RESTful WebサービスではないANYTHINGにアクセスしようとしている場合は、$httpを使用する必要があります。また、$httpを介してRESTful Webサービスにアクセスすることもできます。これは、$resourceを使用するよりもはるかに面倒です。これは、jQuery.ajax(Angularの$httpと同等)を使用して、ほとんどの人がAn​​gularJSの外で行っている方法です。

209
bluehallu

$httpは、汎用AJAX呼び出しを行います。ここで、generalは、RESTfulAPIを含めることができることを意味しますプラス非RESTfulAPI。

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

Restful Apiは、プログラマーが作成したランダムなURLよりもURLの方が整理されているため、近年普及しました。

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つの違いは、$httppromiseを返し、$resourceはオブジェクトを返すことです。 Angularが restangular のようなRESTFul APIに対処するのを支援するサードパーティのプラグインもあります


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

41
Qiang

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

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

  1. $httpの例は豊富で有用であり、一般に必要なものだけです。明確な$resourceの例は少なく、(私の経験では)必要なものはほとんどありません。 Angular初心者の場合、ドキュメントに困惑し、役立つ$resourceの例を見つけることができないと怒るまで、選択の意味を理解することはできません。
  2. $httpは、おそらくあなたが探しているものに対する1対1のメンタルマップです。 $httpで得られるものを理解するために新しい概念を学ぶ必要はありません。 $resourceは、まだメンタルマップを持っていない多くのニュアンスをもたらします。
  3. おっと、新しい概念を学ぶ必要はないと言いましたか? Angular初心者としてdo約束について学ぶ必要があります。 $httpはpromiseを返し、.thenableであるため、Angularおよびpromiseについて学習している新しいこととぴったり合います。直接約束を返さない$resourceは、Angularの基本についての暫定的な把握を複雑にします。
  4. $resourceは、RESTfulなCRUD呼び出しのコードと入出力の変換を凝縮するため、強力です。 $httpの結果を自分で処理するコードを繰り返し書くことにうんざりしているなら、それは素晴らしいことです。 $resourceは、他の誰にもわかりにくい構文とパラメーターの受け渡しのレイヤーを追加します。

3か月前に自分のことを知っていたら、「$http kidにこだわってください。それで問題ありません」と自分に言い聞かせたいと思います。

30

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

23
sparrkli

技術的に言えば$httpまたは$resourceを選択することになると、本質的に正しい答えも間違った答えもありません。

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

$httpが行うことは、非同期HTTP要求を実行することです。

7
Dalorzo

リソースサービスは、REST AP​​SIを操作するのに役立つサービスです。使用する場合、CRUDメソッド(作成、読み取り、更新、削除)を記述しません。

私が見る限り、リソースサービスは単なるショートカットであり、httpサービスで何でもできます。

2
john Smith

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

$ 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/authenticate"

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

それは私の意見です。

2
jayson.centeno

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

0
firdous