#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 Проверь мои обновления