WebApi 2 POST with single string parameter not working
Add [FromBody]
to the API method signature like public IHttpActionResult Post([FromBody]string filterName)
and wrap the ajax data parameter with quotes: data: '"' + bodyContent + '"'
.
Not very intuitive, but it works.
c#
public class ValuesController : ApiController
{
// POST api/values
[HttpPost] // added attribute
public IHttpActionResult Post([FromBody] string filterName) // added FromBody as this is how you are sending the data
{
return new JsonResult<string>(filterName, new JsonSerializerSettings(), Encoding.UTF8, this);
}
JavaScript
$.ajax(
{
url: "/api/Values/", // be consistent and case the route the same as the ApiController
type: "POST",
dataType: 'json',
data: "=Dirty Deeds", // add an = sign
success: function (result) {
console.log(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
console.log(err);
}
});
Explanation
Because you are only sending a single value add the = sign in front of it so it will be treated like forms encoding. You can also add the content type if you want to make it clear that this is what you are doing to the ajax call.
contentType: 'application/x-www-form-urlencoded'
Alternatively you could also send the content via URL OR wrap the content in an object on the server as well as in the ajax call and stringify it.
public class Filter {
public string FilterName {get;set;}
}
public class ValuesController : ApiController
{
// POST api/values
[HttpPost] // added attribute
public IHttpActionResult Post([FromBody] Filter filter) // added FromBody as this is how you are sending the data
{
return new JsonResult<string>(filter.FilterName, new JsonSerializerSettings(), Encoding.UTF8, this);
}
JavaScript
$.ajax(
{
url: "/api/Values/", // be consistent and case the route the same as the ApiController
type: "POST",
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({FilterName: "Dirty Deeds"}), // send as json
success: function (result) {
console.log(result);
},
error: function (xhr, status, p3, p4) {
var err = "Error " + " " + status + " " + p3;
if (xhr.responseText && xhr.responseText[0] == "{")
err = JSON.parse(xhr.responseText).message;
console.log(err);
}
});