使用 GET 将数据作为复杂对象从 API 控制器请求数据

Requesting Data from API Controller using GET with data as complex object

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

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

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

无论如何,我无法让 .NET 使用 AJAX post 中的对象序列化数据 posted(使用 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 request/response.

您可能会看出我正在尝试获取图表数据,所以它没有改变,因此缓存响应对我来说就足够了。

我尝试了 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
            }
        });

这正在生成一个 URL,例如:/Chart/ProductStockHistory?value=%7B"dateFrom "%3AdateFromValue%2C"dateTo"%3AdateToValue%7D,看起来是正确的,但是 .NET 没有序列化该值,我得到一个 null/default 对象作为 value 在我的控制器中。

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

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

您无需根据 ajax 请求调用 JSON.stringify。这样的事情应该有效:

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

这应该会产生如下请求 url: /Chart/ProductStockHistory?dateFrom=dateFromValue&dateTo=dateToValue&groupBy=groupByValue

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