2012-10-04 10 views
9

私は、RESTサービスにAngular $resourceを使用します。私の応答を得るには奇妙なので、CRUDアプリケーションには$ resourceサービスを使用できません。

var newCard = new CreditCard(); 
newCard.name = "Mike Smith"; 
newCard.$save(); 

も働く取得:(カードのために言って)新しいオブジェクトの仕事を作成

、smilarに

var card = CreditCard().get({_id:1) 

しかし、GET応答は、オブジェクトCard自体が、他ではありませんメッセージ(ラッパーオブジェクト)

{ message: ".....", 
    response: Card //object 
} 

したがって、インスタンスの取得を保存するとリソースを介して送信されると、(レスポンスフィールドに変更されたCardオブジェクトとともに)ラッパーオブジェクトが送信されます。 これはおそらく正しいですが、私のサーバーはCardオブジェクトがラッパーではないと考えています。 $ resourceをカスタマイズして、目的のオブジェクトを送信する方法はありますか?ドキュメントからは、urlパラメータだけを変更できるようです。

$resource(url[, paramDefaults][, actions]); 
+0

jsfiddleなどの完全な例を投稿できますか?私の経験では、(単純な)CRUDのために、そのような新しいオブジェクトを作成する必要はありません。 $ scope.card = Card.get({_ id:1)のようなあなたのリソースに単純にアクセスするとどうなりますか?ここで、Cardはリソースサービスですか?また、フォームにモデルが何であるかを伝えると、インスタンスに自動的に値が設定されます。 – Narretz

+0

私はあなたの問題が角度にあるとは思わない。サーバー側のREST実装とほぼ同じような音がします。メッセージが添付されてはいけません。応答の本体があなたが期待していたオブジェクトだけであることを確認するために、まずそれをチェックしたいかもしれません。 –

+0

実際にサーバーは実際のオブジェクトの周りにラッパーを送信しています。それでも、サーバー(POST) – bsr

答えて

17

私は$リソースモジュールの標準実装にも問題がありました。しばらくの間、私は自分の$ resourceファイルのローカルコピーを編集しましたが、RESTリソースの実装方法にはまだ不満がありました。私は提供されたよりも柔軟性が必要でした。

標準$resourceモジュールは、$ httpの周りの単なるラッパーです。 $ resourceモジュールのコードを煮詰めれば、独自のカスタム実装を簡単に作成できます。

次に、コントローラ機能内で、$ resourceと同じようにCreditCardファクトリを挿入します。

app.controller('CreditCardCtrl', function($scope, CreditCard) { 
    $scope.creditCard = CreditCard().get(3); 
}); 

これにより、必要に応じてRESTアクションの応答を解析できます。また、任意のアクションを実装することもできます。例えば、私は自分のリソースにsaveメソッドを使って、オブジェクトがidプロパティを持っているかどうかをチェックしてからPOSTを使う(IDがないときは新しいリソースを作る)か、PUTを使うかを調べる有効なIDが利用可能です)。

これは、JSON CSRF Vulnerabilityの別の処理方法を実装することもできます。 angular.jsの方法は$ httpに組み込まれていますが、私の会社のREST APIはJSON配列をダミーオブジェクトにラップすることでこの問題を解決しています。上記のようなカスタムリソースを使用して、ダミーオブジェクトを解析します。

+0

に感謝して返信するときにオブジェクトだけを送信する方法があります。私もラインに沿って考えていました。 – bsr

+0

これは素晴らしい応答です。ブレット、ありがとう。 '$ resource'を使って作業するほど、' $ http'の上にカスタムラッパーを書くという欲求が増えます。 – quickshiftin

+0

このメソッドを使用すると、独自のsave()、delete()などのメソッドを実装する必要がありますか? – JBCP

関連する問題