Reputation: 8765
Why I got an 404 error when I try to post data to a WebAPI action?
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'
},
})
Upvotes: 0
Views: 869
Reputation: 8765
I found the answer here.
It's been quite sometime since I asked this question. Now I understand it more clearly, I'm going to put a more complete answer to help others.
In Web API, it's very simple to remember how parameter binding is happening.
- if you
POST
simple types, Web API tries to bind it from the URLif you
POST
complex type, Web API tries to bind it from the body of the request (this uses amedia-type
formatter).If you want to bind a complex type from the URL, you'll use
[FromUri]
in your action parameter. The limitation of this is down to how long your data going to be and if it exceeds the url character limit.
public IHttpActionResult Put([FromUri] ViewModel data) { ... }
If you want to bind a simple type from the request body, you'll use [FromBody] in your action parameter.
public IHttpActionResult Put([FromBody] string name) { ... }
as a side note, say you are making a
PUT
request (just a string) to update something. If you decide not to append it to the URL and pass as a complex type with just one property in the model, then thedata
parameter in jQuery ajax will look something like below. The object you pass to data parameter has only one property with empty property name.var myName = 'ABC'; $.ajax({url:.., data: {'': myName}});
and your web api action will look something like below.
public IHttpActionResult Put([FromBody] string name){ ... }
This asp.net page explains it all. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
tnx @Amila
Upvotes: 1
Reputation: 42497
By default, Web API tries to match simple parameters from the URI, but you are supplying them in the body. In my original answer, I forgot you can't use FromBodyAttribute
more than once. In this case, I'd create a model class to contain the values. Web API will then read this "complex" type from the body.
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" }
};
}
}
Upvotes: 0