출처 : http://weblogs.asp.net/dwahlin/using-an-angularjs-factory-to-interact-with-a-restful-service
서버 사이드
public class CustomersController : ApiController { ICustomerRepository _Repository; public CustomersController() { //CustomerRepository could be injected if desired _Repository = new CustomerRepository(); } // GET api/customers public HttpResponseMessage Get() { var custs = _Repository.GetCustomers(); if (custs == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Request.CreateResponse<IEnumerable<Customer>>(HttpStatusCode.OK, custs); } // GET api/customers/5 public HttpResponseMessage Get(int id) { var cust = _Repository.GetCustomer(id); if (cust == null) throw new HttpResponseException(HttpStatusCode.NotFound); return Request.CreateResponse<Customer>(HttpStatusCode.OK, cust); } // POST api/customers public HttpResponseMessage Post([FromBody]Customer cust) { var newCust = _Repository.InsertCustomer(cust); if (newCust != null) { var msg = new HttpResponseMessage(HttpStatusCode.Created); msg.Headers.Location = new Uri(Request.RequestUri + newCust.ID.ToString()); return msg; } throw new HttpResponseException(HttpStatusCode.Conflict); } // PUT api/customers/5 public HttpResponseMessage Put(int id, [FromBody]Customer cust) { var status = _Repository.UpdateCustomer(cust); if (status) return new HttpResponseMessage(HttpStatusCode.OK); throw new HttpResponseException(HttpStatusCode.NotFound); } // DELETE api/customers/5 public HttpResponseMessage Delete(int id) { var status = _Repository.DeleteCustomer(id); if (status) return new HttpResponseMessage(HttpStatusCode.OK); throw new HttpResponseException(HttpStatusCode.NotFound); } [HttpGet] public List<Order> Orders(int custID) { var orders = _Repository.GetOrders(custID); if (orders == null)
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); return orders; } }
클라이언트 모듈
var app = angular.module('customersApp', ['ngRoute']); app.config(['$routeProvider', function ($routeProvider) { $routeProvider.when('/', { controller: 'customersController', templateUrl: '/app/views/customers.html' }) .otherwise({ redirectTo: '/' }); }]);
클라이언트 팩토리
angular.module('customersApp') .factory('dataFactory', ['$http', function($http) { var urlBase = '/api/customers'; var dataFactory = {}; dataFactory.getCustomers = function () { return $http.get(urlBase); }; dataFactory.getCustomer = function (id) { return $http.get(urlBase + '/' + id); }; dataFactory.insertCustomer = function (cust) { return $http.post(urlBase, cust); }; dataFactory.updateCustomer = function (cust) { return $http.put(urlBase + '/' + cust.ID, cust) }; dataFactory.deleteCustomer = function (id) { return $http.delete(urlBase + '/' + id); }; dataFactory.getOrders = function (id) { return $http.get(urlBase + '/' + id + '/orders'); }; return dataFactory; }]);
클라이언트 서비스
angular.module('customersApp') .service('dataService', ['$http', function ($http) { var urlBase = '/api/customers'; this.getCustomers = function () { return $http.get(urlBase); }; this.getCustomer = function (id) { return $http.get(urlBase + '/' + id); }; this.insertCustomer = function (cust) { return $http.post(urlBase, cust); }; this.updateCustomer = function (cust) { return $http.put(urlBase + '/' + cust.ID, cust) }; this.deleteCustomer = function (id) { return $http.delete(urlBase + '/' + id); }; this.getOrders = function (id) { return $http.get(urlBase + '/' + id + '/orders'); }; }]);
클라이언트 컨트롤러
angular.module('customersApp') .controller('customersController', ['$scope', 'dataFactory', function ($scope, dataFactory) { $scope.status; $scope.customers; $scope.orders; getCustomers(); function getCustomers() { dataFactory.getCustomers() .success(function (custs) { $scope.customers = custs; }) .error(function (error) { $scope.status = 'Unable to load customer data: ' + error.message; }); } $scope.updateCustomer = function (id) { var cust; for (var i = 0; i < $scope.customers.length; i++) { var currCust = $scope.customers[i]; if (currCust.ID === id) { cust = currCust; break; } } dataFactory.updateCustomer(cust) .success(function () { $scope.status = 'Updated Customer! Refreshing customer list.'; }) .error(function (error) { $scope.status = 'Unable to update customer: ' + error.message; }); }; $scope.insertCustomer = function () { //Fake customer data var cust = { ID: 10, FirstName: 'JoJo', LastName: 'Pikidily' }; dataFactory.insertCustomer(cust) .success(function () { $scope.status = 'Inserted Customer! Refreshing customer list.'; $scope.customers.push(cust); }). error(function(error) { $scope.status = 'Unable to insert customer: ' + error.message; }); }; $scope.deleteCustomer = function (id) { dataFactory.deleteCustomer(id) .success(function () { $scope.status = 'Deleted Customer! Refreshing customer list.'; for (var i = 0; i < $scope.customers.length; i++) { var cust = $scope.customers[i]; if (cust.ID === id) { $scope.customers.splice(i, 1); break; } } $scope.orders = null; }) .error(function (error) { $scope.status = 'Unable to delete customer: ' + error.message; }); }; $scope.getCustomerOrders = function (id) { dataFactory.getOrders(id) .success(function (orders) { $scope.status = 'Retrieved orders!'; $scope.orders = orders; }) .error(function (error) { $scope.status = 'Error retrieving customers! ' + error.message; }); }; }]);