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



我有,直到今天总是使用POST从。net core/MVC应用程序的API控制器获得响应,但一直在与性能作斗争,并注意到POST不能缓存…

所以,我试图改变事情使用GET请求。

我不喜欢这个,因为我宁愿作为一种形式发送的数据,不是在URL中……但如果必须,它必须

无论如何,我有麻烦让。net序列化在AJAX post中使用对象发布的数据(使用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
}
});

This works fine…但是根据我的开场白,我不能缓存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
}
});

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

这是完全有可能的,我接近它的错误,但我怎么能得到一个缓存的响应时,使用一个复杂的对象作为一个值在控制器?

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

您不需要在ajax请求中调用JSON.stringify。像这样的代码应该可以工作:

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

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

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

最新更新