【问题标题】:How to receive JSON data on WebAPI backend C#?如何在 WebAPI 后端 C# 上接收 JSON 数据?
【发布时间】:2015-09-10 10:13:35
【问题描述】:

如何在 C# 中的 WebAPI 后端接收 JSON 数据?

我的 JavaScript 前端发送了以下 JSON。

{
    "User_Id": 1,
    "TotalPrice": 35,
    "DeliveryAddress": "At my house",
    "CartItems": [
        {
            "Id": 1009,
            "Name": "Superman juni 2014",
            "Quantity": 1,
            "Price": 35
        }
    ]
}

我有这些课程:

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; }
    }

还有我的 WebAPI 方法:

[System.Web.Mvc.HttpPost]
        public bool AddOrder(PurchaseOrder order)
        {
            // Here I will do something

            return true;
        } 

我的“PurchaseOrder order”对象的结果只有“null”。问题可能是我正在使用 [System.Web.Mvc.HttpPost] 吗?我也尝试过 [System.Web.Http.HttpPost],但得到了相同的结果。 // 马丁

【问题讨论】:

  • 您是否在 JavaScript 请求中将 Content-Type 设置为 application/json
  • 你能包含完整的 Javascript 请求吗?
  • 使用您的数据构建一个名为 order 的 javascript 对象,并在发布时使用 JSON.stringify
  • 除非您使用 vNext,否则这是错误的 System.Web.Mvc.HttpPost 它应该来自 Http 命名空间我相信不是 Mvc 一个。其次,这与您的 JavaScript 有关。

标签: c# json asp.net-web-api


【解决方案1】:

您请求的Content-Type 应为"application/json"

如果您在请求正文中发布您的 json,则将方法签名更改为

[HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{
}

【讨论】:

  • contentType 在javascript中。
  • [FromBody] 可能不是必需的。
  • @AmitKumarGhosh 不,[FromBody] 肯定是必要的。默认情况下,WebApiController 实例在 URL 中查找参数。如果您使用的是 JSON 字符串并发布它,则它必须查看请求正文。
【解决方案2】:

问题解决了,缺少的是“应用程序/json”。对于其他有同样问题的人,这是我的功能。我正在使用 Knockout.js,因此是“自我”一词。

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");

                }
            });
        }

【讨论】:

  • var self = this 是很常见的事情,让我们知道您所指的 this 是什么,因为当您在里面说 error: function () {} 时,这可能会发生变化。
【解决方案3】:

将您的实现更改为此。

[System.Web.Http.HttpPost]
public bool AddOrder([FromBody] PurchaseOrder order)
{

}

更多详情-http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

【讨论】:

  • 对于WebApi,你应该使用这个属性[System.Web.Http.HttpPost]
  • @SaveendraEkanayake 看起来您与 Anton 在同一时间输入了此回复,并且在他完成后 11 分钟才提交...但这基本上是一样的——至少您有一个链接。错过了关于 Content-Type 的部分.. 但是 OP 没有发布他的 JavaScript 并没有帮助 - 如果他有,我相信你会抓住这一点。 :wink:
【解决方案4】:

尝试使用来自 NuGet 的 Newtonsoft.Json 包。它们具有将任何字符串序列化和反序列化为 Json 的功能。 也尝试使用动态类型变量。有助于反序列化。

【讨论】:

  • 这不是答案。
  • 也不是答案。
猜你喜欢
  • 2018-02-12
  • 2015-03-13
  • 2021-06-16
  • 1970-01-01
  • 2016-02-29
  • 2019-05-18
  • 2017-10-11
  • 2021-05-02
  • 2019-08-08
相关资源
最近更新 更多