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}
使用它,它正在工作。
怎么了?
如果你想从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。