2015-11-17 2 views
0

Как передать объект json в WebApi как GET с использованием $ resource в угловом?

Моя служба:

pmsService.factory('Widgets', ['$resource', function ($resource) { 

    var data = $resource('/api/:path/:id', { 
     path: '@path' 
    }, { 
     getWidgets: { 
      params: { path: 'widgets' }, 
      method: "GET", 
      isArray: true 
     }, 
     getWidget: { 
      params: { path: 'widgets' }, 
      method: "GET", 
      isArray: false 
     }, 
     getWidgetData: { 
      params: { path: 'widgets' }, 
      method: "POST" 
     }, 
    }); 
    return data; 

В угловом контроллере:

Widgets.getWidgetData({ id: $scope.widget.id}, $scope.paramValues).$promise.then(function (data) { 
       $scope.widget.Data = data; 
       $log.debug($scope.widget.Data); 
      }); 

В контроллере:

[Route("api/widgets/{id}")] 
[HttpPost] 
public Object Get(int id, dynamic prms) 
    { 
    .... 
    } 

Это должно посылает 2 параметры WebAPI контроллера, идентификатор и список параметров Виджет. Скрипач показывает:

/API/виджеты/31 /% 5Bobject% 20Object% 5D

Так работает маршрутизация правильно, но объект СУНР я получил пустой.

+1

paramValues ​​должно быть число/строка/булево .. и т.д. Не является объектом. Если вы хотите отправить объект, переключитесь на запрос POST – sirrocco

+0

, но могу ли я получить данные обратно при использовании POST? – Whistler

+0

Конечно, вы можете – sirrocco

ответ

0

Я действительно не понимаю, что вы пытаетесь сделать там, но , если вы пытаетесь достичь параметра url, как в /api/widgets/31?foo=bar, тогда я это сделаю.

angular 
    .module('myMod', ['$resource']) 

    .factory('Widgets', 
    ['$resource', function ($resource) { 
    return $resource(
     '/api/:path/:id/', 
     {'path': '@path'}, 
     { 
     getWidgets: { 
      params: {path: 'widgets'}, 
      method: "GET", 
      isArray: true 
     }, 
     getWidget: { 
      params: {path: 'widgets'}, 
      method: "GET", 
      isArray: false 
     }, 
     getWidgetData: { 
      params: {path: 'widgets'}, 
      method: "GET", 
      isArray: false 
     } 
     }) 
    }]) 

    .controller('WidgetsController', 
    ['$scope', 'Widgets', function ($scope, Widgets) { 
    $scope.widget = Widgets.getWidget({ 
     id: 1, 
     foo: 'bar' 
    }); 
    }]); 

Это сделало бы запрос GET на /api/widgets/1?foo=bar. Вы можете включать в себя вложенный объект или массив, как это и будет сериализовать и добавляется к URL

// In controller 
    .controller('WidgetsController', 
    ['$scope', 'Widgets', function ($scope, Widgets) { 
    $scope.widget = Widgets.getWidget({ 
     id: 1, 
     fields: ['name', 'price'] 
    }); 
    }]); 

Это позволит сделать запрос GET к /api/widgets/1?fields=name&fields=price. Я обычно предпочитаю использовать сериализатор $httpParamSerializerJQLike для сериализации параметров в этой форме /api/widgets/1?fields[]=name&fields[]=price, что в моем опыте менее проблематично. Для того, чтобы использовать эту сериалайзер, вам нужно настроить $http как так

angular 
    .module('myMod') 

    .config(['$httpProvider', function ($httpProvider) { 
    $httpProvider.defaults.paramSerializer = '$httpParamSerializerJQLike'; 
    }]) 

Надежда, что помогает

+0

Я хочу отправить объект Json, который является списком настроек для виджета. Ваш пример отправляет строку, и мне нужно отправить объект. Я думаю, что @sirroco прав, и я должен использовать POST, который я сделал и редактирую вопрос. К сожалению, это не работает – Whistler

+0

строка может быть расшифрована на стороне сервера, я не уверен, как это делается с asp.net ... взгляните на этот [ответ] (http://stackoverflow.com/a/1080721/4054434) к аналогичному вопросу –

+0

Я получил ответ для MVC, я переношу приложение в WebApi, и этот бит не работает – Whistler

Смежные вопросы