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>();
}