AngularJs / webAPI:在webAPI的参数中收到null

时间:2015-08-04 09:59:46

标签: c# json angularjs asp.net-web-api

我正在使用AngularJS,我正在尝试将json从我的服务发送到webAPI控制器。当我发送通过我在webApi函数中的参数中收到null。

我的功能服务是:

angular.module('productsApp')
    .service('ProductDetailService', ['$http', function ($http) {
        var urlBase = "/api/productdetail";

        this.Salvar = function (product) {
            var mydata = JSON.stringify(product);
            debugger;

            return $http({
                method: 'POST',
                url: urlBase + "/salvar/" + mydata,
                data: mydata,
                headers: { 'Content-Type': 'application/json' }
            });
        };
    }]);

我在webAPI中的代码是:

public class ProductDetailController : BaseController
{
    [Route("api/productdetail/salvar/{item}")]
    [HttpPost]
    public bool Salvar(string item)
    {
        return true;
    }
}

我的app.js是:

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

app.config(['$routeProvider', function ($routeProvider)
{
    $routeProvider.when('/', {
        controller: 'ProductController',
        templateUrl: '/Scripts/App/Html/ProductList.html'
    }).
    when('/testprice', {
        controller: 'ProductController',
        templateUrl: '/Scripts/App/Html/ProductDetail.html'
    }).
    when('/editar/1', {
        controller: 'ProductController',
        templateUrl: '/Scripts/App/Html/ProductDetail.html'
    }).
    when('/api/productdetail/salvar/*', {
        controller: 'ProductDetailController',
        templateUrl: '/Scripts/App/Html/ProductDetail.html'
    })
    .otherwise({ redirectTo: '/' });

}]);

服务中的问题是当我在webService null中添加类型data: something时,我必须在complet uri中添加我的数据,例如:

http//.../api/productdetail/salvar/{mydata}

使用它,它正在工作。

出了什么问题?

2 个答案:

答案 0 :(得分:3)

如果要从HTTP / POST正文接收纯文本,则需要将[FromBody]属性应用于控制器操作的输入参数:

[Route("api/productdetail/salvar")]
[HttpPost]
public bool Salvar([FromBody] string item)
{
    return true;
}

虽然你可以这样做,但是WebAPI希望你设计一个DTO并使用DTO实例接收POST数据(WebAPI根据其类型将JSON反序列化为参数):

[Route("api/productdetail/salvar")]
[HttpPost]
public bool Salvar(MyData item)
{
    return true;
}

MyData可能如下所示:

public class MyData
{
     public string Text { get; set; }
}

你的Angular应用程序应该发送一个这样的JSON:{ "Text": "hello world" }

最后,WebAPI实施RESTful API开发,您的路由是RPC风格的。您应该将其重命名为api/product/details并将数据POST到此资源URI。否则,您不是在设计RESTful API!

请记住,REST喜欢使用HTTP动词表达动作:

  • POST是创建
  • PUT是 update
  • GET是 get all,get by pages或get by id
  • 删除按ID,范围删除
  • ...

总之,不要将动词放在资源URI中,而是使用HTTP动词来表达对暴露资源的处理方式。

答案 1 :(得分:1)

只是给我的食物。如果您有一个属性设置为无效类型,如字符串被设置为json中的对象。 api不会翻译任何内容,你会得到一个null。