使用 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&dateTo=dateToValue&groupBy=groupByValue
.net 核心将这些值正确绑定到您的 ChartQuery
模型。
【讨论】:
难以置信的简单!!谢谢 没问题。很高兴我能帮忙:D以上是关于使用 GET 将数据作为复杂对象从 API 控制器请求数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从 jQuery ajax 调用将复杂对象传递给 ASP.NET WebApi GET?
如何将复杂的 C# 类序列化为 XML 并将其作为 .net 核心 API 的响应发送?
Swift - 从模型中的 API 调用返回 JSON 对象作为字典以在视图控制器中使用