API Returns 在 API 中正常但没有数据
API Returns OK in API but no Data
我正在尝试 return 通过我创建的另一个 API 模型中的一个对象,但是当我在 PostMan 上使用 GET 获取我的 API 时,它仅 returns 200 OK 但数组为空。
这就是我想要得到的:
[
{
"productId": 0,
"quantity": 0
}
]
这就是我在 PostMan 中得到的
[]
通过调用 API URL:
http://localhost:5700/api/Orders/basket/firstId
这是我的控制器和我在 Postman 中调用的相应 GET 方法:
[HttpGet("basket/{identifier}")]
public async Task<IEnumerable<BasketEntryDto>> FetchBasketEntries(string identifier)
{
var httpRequestMessage = new HttpRequestMessage(
HttpMethod.Get,
$"https://localhost:5500/api/Basket/{identifier}")
{
Headers = { { HeaderNames.Accept, "application/json" }, }
};
var httpClient = httpClientFactory.CreateClient();
using var httpResponseMessage =
await httpClient.SendAsync(httpRequestMessage);
var basketEntires = Enumerable.Empty<BasketEntryDto>();
if (!httpResponseMessage.IsSuccessStatusCode)
return basketEntires;
using var contentStream =
await httpResponseMessage.Content.ReadAsStreamAsync();
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var basketDTO = await JsonSerializer.DeserializeAsync
<BasketDto>(contentStream, options);
//basketDTO = new NewBasketDTO.ItemDTO
//{
// ProductId = basketDTO.ProductId,
// Quantity = basketDTO.Quantity
//};
basketEntires = basketDTO.Entries.Select(x =>
new BasketEntryDto
{
ProductId = x.ProductId,
Quantity = x.Quantity
}
);
return basketEntires; // 200 OK
}
这是我的 BasketDTO
:
public class BasketDto
{
public string Identifier { get; set; }
public IEnumerable<BasketEntryDto> Entries { get; set; } = new List<BasketEntryDto>();
}
和我的 BasketEntryDto
:
public class BasketEntryDto
{
public int ProductId { get; set; }
public int Quantity { get; set; }
}
这是 JSON 中的原始 API:
{
"identifier": "mrPostMan",
"items": [
{
"productId": 1,
"quantity": 1
}
]
}
我想在其中获取 items
数组及其对象。
我做错了什么吗?为什么它 return 是一个空数组?在此先感谢您的帮助..
好吧,当物品多于 0 件时(购物篮不为空),这会起作用,但当购物篮为空时则不起作用,因为:
basketEntires = basketDTO.Entries.Select(x =>
new BasketEntryDto
{
ProductId = x.ProductId,
Quantity = x.Quantity
}
);
没有项目,select将不起作用。所以你可以这样做:
if(basketEntires.Count == 0)
{
basketEntires = new BasketEntryDto
{
ProductId = 0,
Quantity = 0
}
}
return basketEntires; // 200 OK
并且不要忘记添加 .ToList()
:
basketEntires = basketDTO.Entries.Select(x =>
new BasketEntryDto
{
ProductId = x.ProductId,
Quantity = x.Quantity
}
).ToList();
你不应该 return IEnumerable
,你应该 return 列表(或数组)。
正如我在评论中提到的,您需要将 BasketDTO
中的 Entries
属性 更改为 Items
以匹配 JSON 属性名字.
public class BasketDto
{
public string Identifier { get; set; }
public IEnumerable<BasketEntryDto> Items { get; set; } = new List<BasketEntryDto>();
}
或者,您也可以使用 JsonPropertyNameAttribute
明确提及 JSON 属性 名称
public class BasketDto
{
public string Identifier { get; set; }
[JsonPropertyName("items")]
public IEnumerable<BasketEntryDto> Entries { get; set; } = new List<BasketEntryDto>();
}
我正在尝试 return 通过我创建的另一个 API 模型中的一个对象,但是当我在 PostMan 上使用 GET 获取我的 API 时,它仅 returns 200 OK 但数组为空。
这就是我想要得到的:
[
{
"productId": 0,
"quantity": 0
}
]
这就是我在 PostMan 中得到的
[]
通过调用 API URL:
http://localhost:5700/api/Orders/basket/firstId
这是我的控制器和我在 Postman 中调用的相应 GET 方法:
[HttpGet("basket/{identifier}")]
public async Task<IEnumerable<BasketEntryDto>> FetchBasketEntries(string identifier)
{
var httpRequestMessage = new HttpRequestMessage(
HttpMethod.Get,
$"https://localhost:5500/api/Basket/{identifier}")
{
Headers = { { HeaderNames.Accept, "application/json" }, }
};
var httpClient = httpClientFactory.CreateClient();
using var httpResponseMessage =
await httpClient.SendAsync(httpRequestMessage);
var basketEntires = Enumerable.Empty<BasketEntryDto>();
if (!httpResponseMessage.IsSuccessStatusCode)
return basketEntires;
using var contentStream =
await httpResponseMessage.Content.ReadAsStreamAsync();
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var basketDTO = await JsonSerializer.DeserializeAsync
<BasketDto>(contentStream, options);
//basketDTO = new NewBasketDTO.ItemDTO
//{
// ProductId = basketDTO.ProductId,
// Quantity = basketDTO.Quantity
//};
basketEntires = basketDTO.Entries.Select(x =>
new BasketEntryDto
{
ProductId = x.ProductId,
Quantity = x.Quantity
}
);
return basketEntires; // 200 OK
}
这是我的 BasketDTO
:
public class BasketDto
{
public string Identifier { get; set; }
public IEnumerable<BasketEntryDto> Entries { get; set; } = new List<BasketEntryDto>();
}
和我的 BasketEntryDto
:
public class BasketEntryDto
{
public int ProductId { get; set; }
public int Quantity { get; set; }
}
这是 JSON 中的原始 API:
{
"identifier": "mrPostMan",
"items": [
{
"productId": 1,
"quantity": 1
}
]
}
我想在其中获取 items
数组及其对象。
我做错了什么吗?为什么它 return 是一个空数组?在此先感谢您的帮助..
好吧,当物品多于 0 件时(购物篮不为空),这会起作用,但当购物篮为空时则不起作用,因为:
basketEntires = basketDTO.Entries.Select(x =>
new BasketEntryDto
{
ProductId = x.ProductId,
Quantity = x.Quantity
}
);
没有项目,select将不起作用。所以你可以这样做:
if(basketEntires.Count == 0)
{
basketEntires = new BasketEntryDto
{
ProductId = 0,
Quantity = 0
}
}
return basketEntires; // 200 OK
并且不要忘记添加 .ToList()
:
basketEntires = basketDTO.Entries.Select(x =>
new BasketEntryDto
{
ProductId = x.ProductId,
Quantity = x.Quantity
}
).ToList();
你不应该 return IEnumerable
,你应该 return 列表(或数组)。
正如我在评论中提到的,您需要将 BasketDTO
中的 Entries
属性 更改为 Items
以匹配 JSON 属性名字.
public class BasketDto
{
public string Identifier { get; set; }
public IEnumerable<BasketEntryDto> Items { get; set; } = new List<BasketEntryDto>();
}
或者,您也可以使用 JsonPropertyNameAttribute
明确提及 JSON 属性 名称public class BasketDto
{
public string Identifier { get; set; }
[JsonPropertyName("items")]
public IEnumerable<BasketEntryDto> Entries { get; set; } = new List<BasketEntryDto>();
}