当我尝试将数据发布到WebAPI操作时,为什么会出现404错误?
C#:
public class ProductsController : ApiController
{
[HttpPost]
public List<Product> GetProductsByCategoryId(int categoryId, string title)
{
return new List<Product>
{
new Product { Id = 1 , Name = "Test" }
};
}
}
jQuery的:
$.ajax({
url: '/api/products',
type: 'POST',
data: {
categoryId: 12,
title: 'ABC'
},
})
答案 0 :(得分:1)
我找到了答案here。
自从我问这个问题以来,已经有一段时间了。现在我明白了 更清楚的是,我将提供一个更完整的答案来帮助 其他
在Web API中,记住参数绑定的方式非常简单 发生。
- 如果您
POST
为简单类型,则Web API会尝试将其与网址绑定如果您
POST
复杂类型,Web API会尝试将其与请求正文绑定(这会使用media-type
格式化程序)。如果要从网址绑定复杂类型,则会在action参数中使用
[FromUri]
。这个限制是下降的 您的数据将持续多长时间以及它是否超过网址字符 限制。
public IHttpActionResult Put([FromUri] ViewModel data) { ... }
如果要从请求正文绑定一个简单类型,您将在action参数中使用[FromBody]。
public IHttpActionResult Put([FromBody] string name) { ... }
作为附注,说你正在发出
PUT
请求(只是一个字符串) 更新一些东西如果您决定不将其附加到URL并传递 作为模型中只有一个属性的复杂类型,data
jQuery中的参数ajax看起来如下所示。物体 传递给data参数只有一个属性为empty属性 名。var myName = 'ABC'; $.ajax({url:.., data: {'': myName}});
并且您的网络API动作将如下所示。
public IHttpActionResult Put([FromBody] string name){ ... }
这个asp.net页面解释了这一切。 http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
tnx @Amila
答案 1 :(得分:0)
默认情况下,Web API会尝试从URI中match个简单参数,但您要在正文中提供这些参数。在我原来的回答中,我忘了你不能多次使用FromBodyAttribute
。在这种情况下,我创建一个包含值的模型类。然后,Web API会读取这个&#34;复杂的&#34;来自身体的类型。
public class ProductCategoryModel
{
public int CategoryId { get; set; }
public string Title { get; set; }
}
public class ProductsController : ApiController
{
[HttpPost]
public List<Product> GetProductsByCategoryId(ProductCategoryModel model)
{
return new List<Product>
{
new Product { Id = 1 , Name = "Test" }
};
}
}