呼び出したいWebサービスがいくつかあります。 $resource
または$http
、どちらを使用すればよいですか?
$resource
: https://docs.angularjs.org/api/ngResource/service/$resource
$http
: https://docs.angularjs.org/api/ng/service/$http
上記の2つのAPIページを読んだ後、失われました。
違いは何で、どのような状況でそれらを使用すればよいのか、わかりやすい英語で説明してもらえますか?これらの呼び出しを構造化し、結果をjsオブジェクトに正しく読み込むにはどうすればよいですか?
$http
は汎用AJAX用です。ほとんどの場合、これが使用するものです。 $http
を使用すると、GET
、POST
、DELETE
型の呼び出しを手動で行い、返されるオブジェクトを自分で処理することになります。
$resource
は、RESTful Web APIシナリオで使用するために$http
をラップします。
非常に一般的に言えば、RESTful Webサービスは、GET
、POST
、PUT
、DELETE
などのHTTPメソッドに基づいて、そのデータ型でさまざまな処理を行うデータ型の1つのエンドポイントを持つサービスです。したがって、$resource
でGET
を使用してリソースをJavaScriptオブジェクトとして取得し、それを変更してPOST
で送信するか、DELETE
で削除します。
...それが理にかなっている場合。
他の答えは正しいですが、質問の根源を十分に説明していないように感じます:REST
はHTTP
のサブセットです。これは、REST
を介して実行できるすべてがHTTP
を介して実行できることを意味しますが、HTTP
を介して実行できるすべてがREST
を介して実行できるわけではありません。 $resource
が$http
を内部的に使用するのはそのためです。
だから、いつお互いを使うのか?
必要なものがREST
のみ、つまりRESTful
Webサービスにアクセスしようとしている場合、$resource
を使用すると、そのWebサービスとのやり取りが非常に簡単になります。
代わりに、RESTful
WebサービスではないANYTHINGにアクセスしようとしている場合は、$http
を使用する必要があります。また、$http
を介してRESTful
Webサービスにアクセスすることもできます。これは、$resource
を使用するよりもはるかに面倒です。これは、jQuery.ajax
(Angularの$http
と同等)を使用して、ほとんどの人がAngularJSの外で行っている方法です。
$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');
}]);
これにより、 リソースオブジェクト が得られます。これには、get
、save
、query
、remove
、delete
メソッドが自動的に伴います。
$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つの違いは、$http
はpromise
を返し、$resource
はオブジェクトを返すことです。 Angularが restangular のようなRESTFul APIに対処するのを支援するサードパーティのプラグインもあります
APIが/api/getcarsinfo
のようなものである場合。あとは$http
を使用するだけです。
答えは、コードを書いている時点で誰youに依存していると思います。 Angularを初めて使用する場合は、$http
が必要な理由がわかるまで、$resource
を使用してください。$http
がどのように妨げているかを具体的に経験し、$resource
を使用する意味を理解するまであなたのコード、$http
に固執します。
これが私の経験でした。最初のAngularプロジェクトを開始し、RESTfulインターフェイスにHTTPリクエストを行う必要があったので、今行っているのと同じ調査を行いました。このようなSOの質問で読んだ議論に基づいて、$resource
を選択しました。 これは私が元に戻すことができることを望む間違いでした。理由は次のとおりです。
$http
の例は豊富で有用であり、一般に必要なものだけです。明確な$resource
の例は少なく、(私の経験では)必要なものはほとんどありません。 Angular初心者の場合、ドキュメントに困惑し、役立つ$resource
の例を見つけることができないと怒るまで、選択の意味を理解することはできません。$http
は、おそらくあなたが探しているものに対する1対1のメンタルマップです。 $http
で得られるものを理解するために新しい概念を学ぶ必要はありません。 $resource
は、まだメンタルマップを持っていない多くのニュアンスをもたらします。$http
はpromiseを返し、.then
ableであるため、Angularおよびpromiseについて学習している新しいこととぴったり合います。直接約束を返さない$resource
は、Angularの基本についての暫定的な把握を複雑にします。$resource
は、RESTfulなCRUD呼び出しのコードと入出力の変換を凝縮するため、強力です。 $http
の結果を自分で処理するコードを繰り返し書くことにうんざりしているなら、それは素晴らしいことです。 $resource
は、他の誰にもわかりにくい構文とパラメーターの受け渡しのレイヤーを追加します。3か月前に自分のことを知っていたら、「$http
kidにこだわってください。それで問題ありません」と自分に言い聞かせたいと思います。
$ resourceは、生の文字列ではなく、サーバーからの応答としてオブジェクトまたは配列を予期することを強調することが重要だと思います。したがって、応答として生の文字列(またはオブジェクトと配列以外のもの)がある場合は、$ httpを使用する必要があります
技術的に言えば$http
または$resource
を選択することになると、本質的に正しい答えも間違った答えもありません。
$resource
の目的は、パラメーター値と共にテンプレート文字列(プレースホルダーを含む文字列)を渡すことができるようにすることです。 $resource
は、テンプレート文字列のプレースホルダーを、オブジェクトとして渡されるパラメーター値に置き換えます。 RESTFulデータソースはURLを定義するために同様の原則を使用しているため、これはRESTFulデータソースとやり取りするときに最も役立ちます。
$http
が行うことは、非同期HTTP要求を実行することです。
リソースサービスは、REST APSIを操作するのに役立つサービスです。使用する場合、CRUDメソッド(作成、読み取り、更新、削除)を記述しません。
私が見る限り、リソースサービスは単なるショートカットであり、httpサービスで何でもできます。
.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);
}
それは私の意見です。
現在、$ resourceサービスはpromiseをサポートしていないため、$ httpサービスとは明らかに異なるインターフェースを持っています。