【问题标题】:Requesting Data from API Controller using GET with data as complex object使用 GET 将数据作为复杂对象从 API 控制器请求数据
【发布时间】:2021-10-01 09:47:39
【问题描述】:

我有,直到今天一直使用 POST 从 .NETCore/MVC 应用程序中的 API 控制器获取响应,但一直在努力提高性能并注意到 POST 无法缓存...

所以,我正在尝试更改内容以使用 GET 请求。

我不喜欢这样,因为我更喜欢以表格形式发送的数据,而不是在 URL 中......但如果必须,它必须

无论如何,我无法让 .NET 序列化使用 AJAX 帖子中的对象发布的数据(使用 jQuery 或其他方式,我不在乎)

我的控制器如下所示:

    [HttpGet]
    [Route("ProductStockHistory")]
    public async Task< ChartResponse> ProductStockHistory([FromQuery] ChartQuery value)
    {
     //// do stuff
    }

你可以看到我想发送一个ChartQuery 对象,看起来像这样:

    public class ChartQuery
    {
        public string dateFrom { get; set; }
        public string dateTo { get; set; }
        public string groupBy { get; set; } = "month";
        // more values...
    }

使用 POST,我会这样做:(将 [HttpGet] 属性更改为 [HttpPost][FromQuery] 更改为 [FromBody]

        $.ajax({
            type: "POST",
            url: "/Chart/" + chartAction,
            contentType: "application/json",
            dataType: "json",
            data: JSON.stringify({
                dateFrom : dateFromValue, 
                dateTo : dateToValue, 
                groupBy : groupByValue, 
                // more values...
            }),
            success: function (data) {
                // do stuff
            }
        });

这很好用……但根据我的开场白,我无法缓存 POST 请求/响应。

您可能会说我正在尝试获取图表的数据,因此它不会更改,因此缓存响应对我来说就足够了。

我尝试了 AJAX 代码的许多变体,对我来说最合乎逻辑的看起来是这样的:

        $.ajax({
            type: "GET",
            url: "/Chart/" + chartAction,
            contentType: "application/json",
            dataType: "json",
            data: { value: JSON.stringify({
                dateFrom : dateFromValue, 
                dateTo : dateToValue, 
                groupBy : groupByValue, 
                // more values...
            })},
            processData: true, 
            success: function (data) {
                // do stuff
            }
        });

这会生成一个类似:/Chart/ProductStockHistory?value=%7B"dateFrom "%3AdateFromValue%2C"dateTo"%3AdateToValue%7D 的 URL,看起来差不多,但 .NET 没有序列化该值,我在控制器中得到一个空/默认对象为 value

我完全有可能处理错了,但是在控制器中使用复杂对象作为值时如何获得缓存响应?

编辑:注意,我意识到我可以更改控制器以接收 ChartQuery 对象的各个值,但这不是我想要实现的目标

【问题讨论】:

    标签: ajax asp.net-core controller asp.net-core-mvc asp.net-core-webapi


    【解决方案1】:

    你不需要在你的 ajax 请求上调用JSON.stringify。这样的事情应该可以工作:

    data:{
     dateFrom : dateFromValue, 
     dateTo : dateToValue, 
     groupBy : groupByValue, 
    }
    

    这应该会产生一个这样的请求 url: /Chart/ProductStockHistory?dateFrom=dateFromValue&amp;dateTo=dateToValue&amp;groupBy=groupByValue

    .net 核心将这些值正确绑定到您的 ChartQuery 模型。

    【讨论】:

    • 难以置信的简单!!谢谢
    • 没问题。很高兴我能帮忙:D
    猜你喜欢
    • 2013-09-02
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多