我有多个Web Api Post methods
喜欢:
[HttpPost]
public async Task<IHttpActionResult> Post([FromBody] AdModel adModel)
{
//Post
}
[HttpPost]
[Route("AddToWatchList")]
public async Task<IHttpActionResult> AddToWatchList(int adId)
{
// Post to database
}
这是我的AngularJs服务器:
app.factory('adService', ['$resource', 'ngAuthSettings', function ($resource, ngAuthSettings) {
var serviceBase = ngAuthSettings.apiServiceBaseUri;
return $resource(serviceBase + 'api/Ads/', {}, {
addToWatchList: {
method: 'POST',
url: serviceBase + 'api/Ads/addToWatchList'
}
}
});
}]);
AngularJs控制器:
app.controller('listCategoryAdsController',
['ngAuthSettings', '$scope', 'adService', '$routeParams', '$location',
function (ngAuthSettings, $scope, adService, $routeParams, $location) {
$scope.addToWatchlist = function (adId) {
adService.addToWatchList({ adId: adId }).$promise.then(
function(result) {
var path = $location.path();
$location.path(path).search('nw', 1);
},
function (error) {
});
};
我的Html来自我所谓的方法:
<div class="col-sm-3 text-right price-box" data-ng-repeat="ad in Ads">
<h2 class="item-price">
$ {{ad.price}}
</h2>
<i class="fa fa-certificate">
</i>
<a ng-click="addToWatchlist(ad.adId)" class="btn btn-default btn-sm make-favorite" tooltip="Click to add to watch list"
tooltip-placement="left"
tooltip-trigger="mouseenter">
<i class="fa fa-heart"></i>
<span>Watch list</span>
</a>
</div>
我的问题是Post([FromBody] AdModel adModel)
被称为完美。但是当我打电话给AddToWatchList(int adId)
时,我得到了:
POST http://localhost:8081/api/Ads/addToWatchList 404(未找到)
答案 0 :(得分:0)
您正在向AddToWatchList()发送一个简单类型(int),因此Web API正在查找adId参数的URI。
如果参数是“simple”类型,则Web API会尝试获取该值 来自URI 。简单类型包括.NET基元类型( int , bool,double等等,加上TimeSpan,DateTime,Guid,decimal, 和字符串,以及具有可转换的类型转换器的任何类型 一个字符串。 (稍后将详细介绍类型转换器。)对于复杂类型,Web API尝试使用媒体类型从邮件正文中读取值 格式化。 More on this..
您有几个选择:
1 - 通过URI发送adId ... api / ads / addtowatchlist?adId = 123
$resource(serviceBase + 'api/Ads/addToWatchList', { }, {
addToWatchList: { method:'POST', params:{ adId:adId } }
});
2 - 显然使用第一种方法中的复杂对象。虽然有一个具有单个int属性的类感觉很愚蠢......这就是为什么你和我不喜欢这种方法。但是如果你已经有了一个Ad类,那么重用它并没有错。
3 - 尝试this solution,您需要在其中添加[FromBody]到您的int参数。并发送没有标识符的adId
=123