使用 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
模型。
直到今天,我一直使用 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
模型。