2012-10-04 2 views
9

REST 서비스에는 각도 $resource을 사용합니다. 내 get 응답에 버크로 인해, 나는 $ CRUD 응용 프로그램에 대한 리소스 서비스를 사용할 수 없습니다.

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

또한 $ 리소스 모듈의 표준 구현에 문제가있었습니다. 잠시 동안 $ 리소스 파일의 로컬 복사본을 편집했지만 REST 리소스를 구현하는 방식에 여전히 만족하지 못함을 발견했습니다. 나는 제안 된 것보다 더 많은 융통성이 필요했다.

표준 $resource 모듈은 $ http 주변의 팩토리 래퍼입니다. $ resource 모듈의 코드를 압축하면 자신 만의 사용자 정의 구현을 쉽게 만들 수 있습니다.

var app = angular.module('app', []); 

app.factory('CreditCard', ['$http', function($http) { 

    function CreditCardFactory() { 

     function parseMessage(message) { 
      if (message.response) { 
       return message.response; 
      } 
     } 

     function CreditCard(value) { 
      angular.copy(value || {}, this); 
     } 

     CreditCard.$get = function(id) { 
      var value = this instanceof CreditCard ? this : new CreditCard(); 
      $http({ 
       method: 'GET', 
       url: '/creditcards/' + id 
      }).then(function(response) { 
       var data = response.data; 
       if (data) { 
        angular.copy(parseMessage(data), value); 
       } 
      }); 
      return value; 
     }; 

     CreditCard.prototype.$get = function(id) { 
      CreditCard.$get.call(this, id); 
     }; 

     return CreditCard; 

    } 

    return CreditCardFactory; 

}]); 

그런 다음 컨트롤러 기능 내에서 $ resource처럼 CreditCard 팩토리를 주입하십시오.

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

이렇게하면 원하는 경우 REST 동작의 응답을 구문 분석 할 수 있으며 원하는 동작을 구현할 수 있습니다. 예를 들어, POST (ID를 사용할 수 없을 때 새로운 리소스를 생성)를 사용하기 전에 객체에 id 속성이 있는지 확인하거나 PUT (PUT)을 사용하여 기존 리소스를 업데이트하는 저장 메소드가 필요했습니다. 유효한 ID를 사용할 수 있음).

이렇게하면 JSON CSRF Vulnerability을 다른 방법으로 처리 할 수 ​​있습니다. angular.js 방법은 $ http에 내장되어 있지만 회사의 REST API는 더미 객체에 JSON 배열을 래핑하여이 문제를 해결합니다. 위와 같은 사용자 정의 리소스를 사용하여 더미 객체를 구문 분석합니다.

+0

덕분에 다시 보낼 때 개체를 보낼 수있는 방법이 있습니다. 나도 선을 따라 생각하고 있었다. – bsr

+0

브렛 감사합니다. '$ resource'를 사용하면할수록,'$ http' 꼭대기에 커스텀 래퍼를 쓰고 싶습니다. – quickshiftin

+0

이 메서드를 사용하면 save(), delete() 등의 메서드를 구현해야합니다. – JBCP