How do I receive JSON data on my WebAPI backend in C#?
I have the following JSON sent from my JavaScript frontend.
{
"User_Id": 1,
"TotalPrice": 35,
"DeliveryAddress": "At my house",
"CartItems": [
{
"Id": 1009,
"Name": "Superman juni 2014",
"Quantity": 1,
"Price": 35
}
]
}
I have this classes:
public class PurchaseOrder
{
public List<CartItem> CartItems { get; set; }
public string DeliveryAddress { get; set; }
public int TotalPrice { get; set; }
public int User_Id { get; set; }
}
public class CartItem
{
public int Id { get; set; }
public string Name { get; set; }
public int Quantity { get; set; }
public int Price { get; set; }
}
And my WebAPI method:
[System.Web.Mvc.HttpPost]
public bool AddOrder(PurchaseOrder order)
{
// Here I will do something
return true;
}
I only get "null" as the result for my "PurchaseOrder order" object. Can the problem be that I ́m using [System.Web.Mvc.HttpPost]? I have also tried [System.Web.Http.HttpPost], but get the same result. // Martin
4 Answers 4
The Content-Type
of your request should be "application/json"
If you post your json in a body of the request than change a method signature to
[HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{
}
3 Comments
contentType
in javascript.[FromBody]
might not be necessary.[FromBody]
is mostly assuredly necessary. By default, a WebApiController instance looks in the URL for parameters. If you're using a JSON string and posting that, instead, it has to look in the request body.Problem solved, it was the "application/json" that was missing. For other persons having the same problem, here is my function. I ́m using Knockout.js, hence the "self"-word.
self.makePurchase = function () {
var tempUserId = self.orderUserId();
var tempCartPrice = self.ShoppingCartPrice();
var tempAddress = self.orderAddress();
var tempCart = self.ShoppingCart();
var orderSave = new PurchaseSave(tempUserId, tempCartPrice, tempAddress, tempCart);
var myData = ko.toJSON(orderSave);
console.log(myData);
$.ajax({
type: "POST",
async: false,
url: '/Products/AddOrder',
contentType: "application/json", // Thank you Stackoverflow!!!
dataType: "json",
traditional: true,
data: myData,
error: function (xhr, textStatus, errorThrown) {
console.log(xhr.responseText);
console.log("Inside the error method");
},
success: function (data) {
console.log("Inside the success method");
}
});
}
1 Comment
var self = this
is a common thing, just let's you know what this
you are referring to as this can change when you are inside say error: function () {}
for example.Change your implementation to this.
[System.Web.Http.HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{
}
For more details - http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
2 Comments
[System.Web.Http.HttpPost]
Try using Newtonsoft.Json package from NuGet. They have functions to serialize and deserialize any string to Json. Also try using dynamic type variables. Helps for deserializing.
application/json
on the JavaScript request?order
with your data and useJSON.stringify
while posting.System.Web.Mvc.HttpPost
it should come from theHttp
namespace I believe not theMvc
one. Secondly this is something to do with your JavaScript.