405 состояние при нажатии действий для входа в контроллер

#c# #asp.net-core #.net-core #asp.net-core-webapi

Вопрос:

Идея заключается в том, что с помощью этих методов ItemController я должен быть в состоянии:

  • Получить товары по штрих-коду при нажатии «товар/запрос?штрих-код={штрих-код}»
  • Получите товары со скидкой при нажатии «товар/запрос?скидка={скидка}»
  • Получите элементы по имени, нажав «элемент/запрос?имя={имя}».
  • Получите элементы по категориям, нажав «элемент/запрос?категория={категория}».

И это мой код для действий под глаголом GET:

 [HttpGet("query/{barcode:int}")]
public async Task<IActionResult> GetByBarcode(int barcode)
{
    var item = ...
    
    return Ok(item);
}

[HttpGet("query/{discount:int}")]
public async Task<IActionResult> GetByDiscount(int discount)
{
    var items =  ...
    
    return Ok(items);
}


[HttpGet("query/{name}")]
public async Task<IActionResult> GetByName(string name)
{
    var items = ...
    
    return Ok(items);
}

[HttpGet("query/{category}")]
public async Task<IActionResult> GetByCategory(string category)
{
    var items = ...
    
    return Ok(items);
}
 

Проблема в том, что я продолжаю получать метод 405, который не разрешен, когда я пытаюсь получить доступ к любому из этих действий. Я не знаю, связано ли это с неоднозначностью методов, не могли бы вы мне помочь?

Редактировать:

Заголовок ItemController.cs:

 using InventoryWebApi.DataAccess;
using InventoryWebApi.DTO;
using InventoryWebApi.Models;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace InventoryWebApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class ItemController : ControllerBase
    {
        private readonly IRepository repository;

        public ItemController(IRepository repository)
...
 

Комментарии:

1. Можете ли вы также показать заголовок вашего контроллера? и, возможно, конечные точки запуска тоже будут полезны.

Ответ №1:

вы неправильно используете маршрутизацию.

Ваш код даже не будет запущен, ваши действия будут

 [HttpGet("query/getbybarcode/{barcode:int})]
public async Task<IActionResult> GetByBarcode(int barcode)

[HttpGet("query/getbydiscount/{discount:int}")]
public async Task<IActionResult> GetByDiscount(int discount)
 

Для этих маршрутов вы должны использовать эти URL-адреса

 .../item/query/getbybarcode/{barcode}
..../item/query/getbydiscount/{discount}
 

если вы все еще хотите создать URL-адрес по-своему, вам придется изменить маршрутизацию атрибутов

 [HttpGet("query/getbybarcode)]
public async Task<IActionResult> GetByBarcode(int barcode)

[HttpGet("query/getbydiscount")]
public async Task<IActionResult> GetByDiscount(int discount)

 

и ваш URL-адрес должен быть

 .../item/query/getbydiscount?discount={discount}"
..../item/query/getbybarcode?barcode={barcode}"
 

Обновить

Если вам все еще нужно использовать все ваши URL-адреса для вашего студенческого проекта , то единственный способ-использовать одно действие для всех ваших URL-адресов

 [HttpGet("query")]
public async Task<IActionResult> Get(int? barcode, int? discount, 
string name, string category )
{
 
   if (barcode != null) ...
else if (discount!=null) ...


    var item = ...
    
    return Ok(item);
}
 

Комментарии:

1. Спасибо за ваш ответ! Я понимаю это, но тогда определенно нет другого способа достичь того, что предлагается в описании, не так ли? Bc это упражнение от Hackerrank, и в нем явно сказано, что параметр должен быть после «/query?» в маршруте для каждого случая, без названия действия или чего-либо еще

2. @LuisBarreto Проверь мои обновления