Mohamad Shiralizadeh
Mohamad Shiralizadeh

Reputation: 8765

Why I got an 404 error when I try to post data to a WebAPI action?

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'
    },
})

image

Upvotes: 0

Views: 869

Answers (2)

Mohamad Shiralizadeh
Mohamad Shiralizadeh

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 URL
  • if you POST complex type, Web API tries to bind it from the body of the request (this uses a media-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 the data 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

moribvndvs
moribvndvs

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

Related Questions