【问题标题】:How to pass json object as GET using $resource in angular?如何使用 Angular 中的 $resource 将 json 对象作为 GET 传递?
【发布时间】:2015-11-17 14:06:20
【问题描述】:

如何使用 Angular 中的 $resource 将 json 对象作为 GET 传递给 WebApi?

我的服务:

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)
   {
     ....
   }

这应该向 WebApi 控制器发送 2 个参数,即 Widget 的 id 和参数列表。提琴手表演:

/api/widgets/31/%5Bobject%20Object%5D

所以路由工作正常,但是我收到的对象prms是空的。

【问题讨论】:

  • paramValues 必须是数字/字符串/布尔值等。不是对象。如果要发送对象,请切换到 POST 请求
  • 但是我可以在使用 POST 时取回数据吗?
  • 我试过了,但同样的东西对象是空的,会在一分钟内编辑问题

标签: asp.net angularjs asp.net-web-api


【解决方案1】:

我不太明白你想在那里做什么,但是 如果你想实现/api/widgets/31?foo=bar 中的 url 参数,那么我会这样做。

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'
    });
  }]);

这将向/api/widgets/1?foo=bar 发出GET 请求。您可以像这样包含嵌套对象或数组,它将被序列化并附加到 url

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

这将向/api/widgets/1?fields=name&fields=price 发出 GET 请求。 我通常更喜欢使用$httpParamSerializerJQLike 序列化程序以/api/widgets/1?fields[]=name&fields[]=price 这种形式序列化参数,根据我的经验,这种形式问题较少。要使用这个序列化器,你需要像这样配置$http

angular
  .module('myMod')

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

希望有帮助

【讨论】:

  • 我想发送 Json 对象,它是 Widget 的设置列表。您的示例发送字符串,我需要发送对象。我认为@sirroco 是正确的,我必须使用 POST,我已经完成并编辑了问题。不幸的是,这不起作用
  • 字符串可以在服务器端解码,我不知道它是如何用 asp.net 完成的...看看这个answer 到类似的问题
  • 我得到了 MVC 的答案,我正在将应用程序移植到 WebApi 并且这个位不起作用
  • 例如Widgets.getWidget({id: 1, settings: {height: 5, width: 6}}) 会发送一个像http://admin.etag.bea/api/widgets/1?settings={"height":5,"width":6}这样的请求
  • 我知道你在说什么,但是当我使用字符串 json 对象时,我得到:/api/widgets/31/%7B%22LineID%22:%22SH5%22,%22MachineID%22:%227 %22,%22DateFrom%22:%222015-10-25%22,%22DateTo%22:%222015-11-01%22%7D
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2023-03-21
  • 2022-10-18
相关资源
最近更新 更多