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

Posted

技术标签:

【中文标题】使用 GET 将数据作为复杂对象从 API 控制器请求数据【英文标题】:Requesting Data from API Controller using GET with data as complex object 【发布时间】: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 对象的各个值,但这不是我想要实现的目标

【问题讨论】:

【参考方案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

以上是关于使用 GET 将数据作为复杂对象从 API 控制器请求数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET?

将 API 数据从一个组件传递到另一个组件?

如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?

Swift - 从模型中的 API 调用返回 JSON 对象作为字典以在视图控制器中使用

如何将json POST数据作为对象传递给Web API方法?

如何将类型的对象作为参数传递给Web Api Get / Post方法