Search code examples
http-postusingdotnet-httpclient

Post Scalar data type using HttpClient.PostAsJsonAsync


I am invoking ASP .Net Web API using HttpClient and invoke actions successfully. Also I am able to POST custom object into action as well.

Now problem I am facing is, not able to post scalar data type like Integer,String etc...

Below is my controller and application code that invokes action

// Test application that invoke

[Test]
        public void RemoveCategory()
        {
            HttpClient client = new HttpClient();

            HttpRequestMessage request = new HttpRequestMessage();

            HttpResponseMessage response = client.PostAsJsonAsync<string>("http://localhost:49931/api/Supplier/RemoveCategory/", "9").Result;

            Console.WriteLine(response.Content.ReadAsStringAsync().Result);
        }

// Controller and Action in Web API

public class SupplierController : ApiController
   {
    NorthwindEntities context = new NorthwindEntities();

    [HttpPost]
    public HttpResponseMessage RemoveCategory(string CategoryID)
    {
    try
    {
    int CatId= Convert.ToInt32(CategoryID);
    var category = context.Categories.Where(c => c.CategoryID == CatId).FirstOrDefault();
    if (category != null)
    {
    context.Categories.DeleteObject(category);
    context.SaveChanges();
    return Request.CreateResponse(HttpStatusCode.OK, "Delete successfully CategoryID = "     +     CategoryID);
    }
    else
    {
    return Request.CreateResponse(HttpStatusCode.InternalServerError, "Invalid     CategoryID");
    }
    }
    catch (Exception _Exception)
    {
    return Request.CreateResponse(HttpStatusCode.InternalServerError, _Exception.Message);
    }
    }

When I Post custome object that represent "Category" table in Northwind database all things working properly but I am not able to post scalar data like Integer and String

When I am post string data type I am getting following exception

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:49931/api/Supplier/RemoveCategory/'.","MessageDetail":"No action was found on the controller 'Supplier' that matches the request."}

Can anyone guide me?


Solution

  • You will have to mark your CategoryID parameter as [FromBody]:

    [HttpPost]
    public HttpResponseMessage RemoveCategory([FromBody] string CategoryID)
    { ... }
    

    By default, simple types such as string will be model bound from the URI.