在控制器中点击 GET 操作时的 405 状态
405 status when hitting actions for GET in controller
我的想法是,使用这些 ItemController 方法,我应该能够:
- 点击“item/query?barcode={barcode}”时按条形码获取项目
- 点击“item/query?discount={discount}”
可享受折扣
- 点击“item/query?name={name}”时按名称获取项目
- 点击“item/query?category={category}”时按类别获取项目
这是我在 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 方法不允许。不知道是不是方法之间有歧义的问题,大家能帮帮我吗?
编辑:
Header 共 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)
...
您使用的路由方式有误。
你的代码不会是偶数运行,
你的行动应该
[HttpGet("query/getbybarcode/{barcode:int})]
public async Task<IActionResult> GetByBarcode(int barcode)
[HttpGet("query/getbydiscount/{discount:int}")]
public async Task<IActionResult> GetByDiscount(int discount)
对于此路线,您必须使用此 urls
.../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);
}
我的想法是,使用这些 ItemController 方法,我应该能够:
- 点击“item/query?barcode={barcode}”时按条形码获取项目
- 点击“item/query?discount={discount}” 可享受折扣
- 点击“item/query?name={name}”时按名称获取项目
- 点击“item/query?category={category}”时按类别获取项目
这是我在 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 方法不允许。不知道是不是方法之间有歧义的问题,大家能帮帮我吗?
编辑:
Header 共 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)
...
您使用的路由方式有误。
你的代码不会是偶数运行, 你的行动应该
[HttpGet("query/getbybarcode/{barcode:int})]
public async Task<IActionResult> GetByBarcode(int barcode)
[HttpGet("query/getbydiscount/{discount:int}")]
public async Task<IActionResult> GetByDiscount(int discount)
对于此路线,您必须使用此 urls
.../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);
}