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

本文关键字:webAPI 参数 null AngularJs | 更新日期: 2023-09-27 18:06:19

我正在使用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;
    }
}

my app.js is:

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

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

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

使用它,它正在工作。

怎么了?

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

如果你想从HTTP/POST body接收纯文本,你需要将[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 is update.
  • GET是 GET all、GET by pages或GET by id
  • DELETE是删除id,范围,任何

总而言之,不要在资源uri中放置动词,而是使用HTTP动词来表示对公开的资源要做什么。

让我吃一堑长一智。如果您有一个属性被设置为无效类型,如字符串被设置为json中的对象。这个api不会翻译任何东西,你会得到一个null。