Возвращение URI вновь созданного ресурса в ASP.NET Core 2.2 - PullRequest
0 голосов
/ 23 февраля 2019

Я хотел бы вернуть URI местоположения вновь созданного ресурса в ASP.NET Core 2.2.Вот способ получить продукт питания для поставщика продуктов питания:

[HttpGet("{foodVendorId}/foodItems/{foodItemId}", Name = "GetFoodItem")]
public IActionResult GetFoodVendorFoodItem(int foodVendorId, int foodItemId)
{
    if (!_foodDeliveryAPIRepository.FoodVendorExists(foodVendorId))
    {
        return NotFound();
    }

    var foodItem = _foodDeliveryAPIRepository.GetFoodItemForFoodVendor(foodVendorId, foodItemId);

    if (foodItem == null)
    {
        return NotFound();
    }

    var foodItemResult = Mapper.Map<FoodItemDto>(foodItem);

    return Ok(foodItemResult);
}

А вот метод добавления или создания продукта питания для поставщика продуктов питания:

[HttpPost("{foodVendorId}/foodItems")]
public IActionResult CreateFoodItem(int foodVendorId, [FromBody] FoodItemForCreationDto foodItem)
{
    if (foodItem == null)
    {
        return BadRequest();
    }

    if (!_foodDeliveryAPIRepository.FoodVendorExists(foodVendorId))
    {
        return NotFound();
    }

    var finalFoodItem = Mapper.Map<Entities.FoodItem>(foodItem);

    _foodDeliveryAPIRepository.AddFoodItemForFoodVendor(foodVendorId, finalFoodItem);

    if (!_foodDeliveryAPIRepository.Save())
    {
        return StatusCode(500, "A problem happened while handling your request.");
    }

    var createdFoodItemToReturn = Mapper.Map<Models.FoodItemDto>(finalFoodItem);

    return CreatedAtRoute("GetFoodItem", new
        { foodVendorId = foodVendorId, id = createdFoodItemToReturn.Id }, createdFoodItemToReturn);
}

создавая FoodItem, значения попадают в базу данных, но после создания возвращают ошибку сервера 500.После отладки я понимаю, что ошибка в операторе возврата CreatedAtRoute -

return CreatedAtRoute("GetFoodItem", new
        { foodVendorId = foodVendorId, id = createdFoodItemToReturn.Id }, createdFoodItemToReturn);

Что я делаю не так?- Это не решило мою проблему.

1 Ответ

0 голосов
/ 23 февраля 2019

Я пытался воспроизвести ваше исключение, и я сделал.После отладки я заметил, что когда вы возвращаете CreatedAtRoute, вы передаете id в качестве имени foodItemId , и в этом проблема.

Ваш параметр маршрута names должен быть точно таким же, как и входные параметры GET.

Итак, вот ваш упрощенный код, который я использовал для проверки:

[HttpGet("{foodVendorId}/foodItems/{foodItemId}", Name = "GetFoodItem")]
public IActionResult GetFoodVendorFoodItem(int foodVendorId, int foodItemId)
{
    return Ok(";)");
}

[HttpPost("{foodVendorId}/foodItems")]
public IActionResult CreateFoodItem(int foodVendorId)
{
    return CreatedAtRoute("GetFoodItem", new { foodVendorId, /* this was the problem => */ foodItemId = 5 }, new { result = "Done" });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...