一个控制器中的多个 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);
我的 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);