一个控制器中的多个 Http 获取

Multiple Http Gets in one controller

我的 Web API 应用程序正在运行,我可以使用主键进行 GET,但我需要能够使用其他字段进行 GET,例如 Widgetname,而且我知道我需要指定 '[Route ("api/[controller]/[action]")]' 让它工作。 'GetByID' 动作有效,但 'GetByName' 动作无效。我将我正在做的实际工作的名称更改为 'Widget',因此我可能没有正确重命名所有内容。代码可以编译,但是当我尝试 API 调用 'GetByName' 时,出现 404 错误。这是我的代码:

namespace WidgetAPI.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class WidgetStuffController : ControllerBase
    {
        private readonly WidgetDbContext _context;

        public WidgetStuffController(WidgetDbContext context)
        {
            _context = context;
        }

        // GET: api/WidgetStuff
        [HttpGet]
        public async Task<ActionResult<IEnumerable<WidgetStuff>>> GetWidgetStuff()
        {
            return await _context.StuffHosts.ToListAsync();
        }

        // GET: api/WidgetStuff/GetByID
        [HttpGet("{ID}"), ActionName("GetByID")]
        public async Task<ActionResult<WidgetStuff>> GetByUUID(string ID)
        {
            var widgetStuff = await _context.StuffHosts.FindAsync(ID);

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

        // GET: api/WidgetStuff/GetByName
        [HttpGet("{Name}"), ActionName("GetByName")]
        public async Task<ActionResult<WidgetStuff>> GetByName(string Name)
        {
            var widgetStuff = await _context.StuffHosts.FindAsync(Name);

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

    }
}

如果您需要查看我的 DBContext 或模型,请告诉我。

我认为您的代码没有到达终点

这就是我在 dot.net 核心中进行 api 调用的方式。

[HttpGet]
[Route("GetByName/{Name}")]
public async Task<ActionResult<WidgetStuff>> GetByName(string Name)
        {
            var widgetStuff = await _context.StuffHosts.FindAsync(Name);

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

终点

localhost:5000/api/yourcontroller/GetByName/nospaces_unless_escaped

设置断点并查看您的代码是否抛出错误。

[ProducesResponseType(typeof(ReviewView), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ReviewView), StatusCodes.Status500OK)] [ProducesResponseType(typeof(ReviewView), StatusCodes.Status404OK)]

您的代码可能正在访问控制器,然后主动返回 404。

    [HttpGet("{Name}"), ActionName("GetByName")]
    public async Task<ActionResult<WidgetStuff>> GetByName(string Name)
    {
        var widgetStuff = await _context.StuffHosts.FindAsync(Name);

        if (widgetStuff == null)
        {
            return NotFound(); <---- THIS RETURNS A 404
        }
        return widgetStuff;
    }

问题是 FindAsync 对主键起作用(可能是您 table 中的 ID)。

尝试替换此行:

var widgetStuff = await _context.StuffHosts.FindAsync(Name);

与:

var widgetStuff = await _context.StuffHosts.SingleOrDefaultAsync(a => a.Name == Name);