首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不带属性调用的HttpGet方法

不带属性调用的HttpGet方法
EN

Stack Overflow用户
提问于 2020-10-18 12:42:56
回答 3查看 250关注 0票数 0

GetItems方法运行良好,但属性为"id“的GetItem不工作。在发送get请求时,我会得到返回的所有项,这意味着调用了GetItems()。我遗漏了什么?

代码语言:javascript
运行
复制
// 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)有相同的问题,所有的项目都会被返回。

代码语言:javascript
运行
复制
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);
        }

回应例子:

代码语言:javascript
运行
复制
{
    "id": 1,
    "name": "aaa",
    "isRegistered": true
}
{
    "id": 2,
    "name": "aaa",
    "isRegistered": false
}
{
    "id": 3,
    "name": "bbb",
    "isRegistered": false
}

在Startup.cs中配置方法:

代码语言:javascript
运行
复制
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

        }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-19 02:46:21

您可以将Action添加到您的Route中,比如:[Route("api/[controller]/[action]")],下面是一个工作演示:

代码语言:javascript
运行
复制
[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

结果:

票数 1
EN

Stack Overflow用户

发布于 2020-10-18 13:15:59

检查您的启动,其中有以下几行:

代码语言:javascript
运行
复制
app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });

第一项检查如下:

代码语言:javascript
运行
复制
 [HttpGet("{id:int}")]

你也可以这样做:

代码语言:javascript
运行
复制
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;

}

票数 0
EN

Stack Overflow用户

发布于 2020-10-19 07:09:04

使用路由属性装饰控制器,如下所示:

代码语言:javascript
运行
复制
    [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 )获得筛选列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64413438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档