GetItems
方法运行良好,但属性为"id“的GetItem
不工作。在发送get请求时,我会得到返回的所有项,这意味着调用了GetItems()
。我遗漏了什么?
// GET request: https://localhost:xxxxx/api/Items
// Working
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItems()
{
return await _context.items.ToListAsync();
}
// GET request: https://localhost:xxxxx/api/Items/2
// Not running
[HttpGet("{id}")]
public async Task<ActionResult<Item>> GetItem(long id)
{
var item = await _context.items.FindAsync(id);
if (item == null)
{
return NotFound();
}
return item;
}
我想用名称过滤项目,但是这与上面的GetItem(长id)有相同的问题,所有的项目都会被返回。
GET request: https://localhost:xxxxx/api/Items?name=aaa
// Not running
[HttpGet("{name}")]
public async Task<ActionResult<IEnumerable<Item>>> GetItems(string name)
{
var item = await _context.items.Where(x => x.Name == name).ToListAsync();
if (item == null)
{
return NotFound();
}
return item;
}
[HttpPost]
public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todoItem)
{
_context.TodoItems.Add(todoItem);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetTodoItemById), new { id = todoItem.Id }, todoItem);
}
回应例子:
{
"id": 1,
"name": "aaa",
"isRegistered": true
}
{
"id": 2,
"name": "aaa",
"isRegistered": false
}
{
"id": 3,
"name": "bbb",
"isRegistered": false
}
在Startup.cs中配置方法:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
发布于 2020-10-18 18:46:21
您可以将Action
添加到您的Route
中,比如:[Route("api/[controller]/[action]")]
,下面是一个工作演示:
[Route("api/[controller]/[action]")]
[ApiController]
public class ItemsController : ControllerBase
{
//...
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItems()
{
return await _context.Items.ToListAsync();
}
[HttpGet]
public async Task<ActionResult<Item>> GetItemById(int id)
{
var item = await _context.Items.FindAsync(id);
if (item == null)
{
return NotFound();
}
return item;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItemByName(string name)
{
var item = await _context.Items.Where(x => x.Name == name).ToListAsync();
if (item == null)
{
return NotFound();
}
return item;
}
}
获得请求:
1:https://localhost:xxxxx/api/Items/getitems
结果:
2:https://localhost:xxxxx/api/Items/GetItemById?id=xx
结果:
3:https://localhost:xxxxx/api/Items/GetItemByName?name=xx
结果:
员额请求:
https://localhost:xxxxx/api/Items/todoitem
结果:
发布于 2020-10-18 05:15:59
检查您的启动,其中有以下几行:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
第一项检查如下:
[HttpGet("{id:int}")]
你也可以这样做:
GET request: https://localhost:xxxxx/api/GetItems?name=aaa
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItems(string name)
{
var item = await _context.items.Where(x => x.Name == name).ToListAsync();
if (item == null)
{
return NotFound();
}
return item;
}
发布于 2020-10-18 23:09:04
使用路由属性装饰控制器,如下所示:
[ApiController]
[Route("api/Items")]
public class ItemsController : ControllerBase
{
[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItems()
{
return await _context.items.ToListAsync();
}
[HttpGet("{id}")]
public async Task<ActionResult<Item>> GetItem(long id)
{
var item = await _context.items.FindAsync(id);
if (item == null)
{
return NotFound();
}
return item;
}
}
然后,您应该能够使用请求参数(如https://localhost:xxxxx/api/Items/2
)获得筛选列表。
https://stackoverflow.com/questions/64413438
复制相似问题