簡體   English   中英

ASP.NET REST服務路由

[英]ASP.NET REST service routing

我正在嘗試啟動和運行REST服務( 我遵循了本教程 ),並試圖通過一種簡單的方法來擴展它,以將ToDoItem之一標記為“ Complete”; 從字面上將ID傳遞到應該將其標記為“完成”的方法中。

但是,我正在努力了解路由的工作方式。

這是默認提供的方法,可以通過https:// localhost:44388 / api / values正常運行

如果我添加另一個GET操作(即使具有不同的[Route]屬性),則最終會出現“ AmbiguousActionException:匹配多個操作”

[Route("api/values")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

我嘗試使用以下方法指定路由前綴,以便添加無效。 我在https:// localhost:44388 / api / valueshttps:// localhost:44388 / api / values / getbyname上收到404

[RoutePrefix("api/values")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [Route("getbyname")]
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

我可能嘗試使用錯誤的方法,因此很樂意接受任何建議。 我只希望能夠創建新的REST調用並使它們采取適當的操作。 我需要創建其他控制器嗎? 每個控制器只能限制一個GET / POST / PUT等嗎?


編輯:沒有提供足夠的信息,這里有更多代碼:

[Route("api/ToDo")]
[ApiController]
public class ToDoController : ControllerBase
{
    private readonly ToDoContext _context;

    public ToDoController(ToDoContext toDoContext)
    {
        _context = toDoContext;

        if (_context.ToDoItems.Count() == 0)
        {
            //collection is empty, so add a new item
            ToDoItem item1 = new ToDoItem(1, "example 1");
            ToDoItem item2 = new ToDoItem(2, "example 2");

            _context.ToDoItems.Add(item1);
            _context.ToDoItems.Add(item2);
            _context.SaveChanges();
        }
    }

    //GET: api/todo
    [HttpGet]
    public async Task<ActionResult<IEnumerable<ToDoItem>>> GetToDoItems()
    {
        return await _context.ToDoItems.ToListAsync();
    }

    //GET: api/todo/5
    //[HttpGet(Name = "Get a ToDoItem")]
    //[Route("get{id}")]
    [HttpGet("{id}")]
    public async Task<ActionResult<ToDoItem>> GetToDoItem(long id)
    {
        var todoitem = await _context.ToDoItems.FindAsync(id);

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

    //POST: api/Todo
    [HttpPost]
    public async Task<ActionResult<ToDoItem>> PostToDoItem(ToDoItem todoItem)
    {
        _context.ToDoItems.Add(todoItem);
        await _context.SaveChangesAsync();

        //calls the "GetToDoItem" method above!
        return CreatedAtAction("GetToDoItem", new { id = todoItem.ID }, todoItem);

    }

    //DELETE: api/todo/5
    [HttpDelete("{id}")]
    public async Task<ActionResult<ToDoItem>> DeleteToDoItem(long id)
    {
        var todoItem = await _context.ToDoItems.FindAsync(id);
        if(todoItem == null)
        {
            return NotFound();
        }

        _context.ToDoItems.Remove(todoItem);
        await _context.SaveChangesAsync();

        return todoItem;
    }



    //* -. space to create a "MarkAsComplete" method
    //GET: api/todo/5
    [HttpGet(Name = "{name}")]        
    public async Task<ActionResult<ToDoItem>> MarkAsComplete(long id)
    {
        var todoitem = await _context.ToDoItems.FindAsync(id);

        if (todoitem == null)
        {
            return NotFound();
        }
        else
        {
            todoitem.IsComplete = true;
        }
        return todoitem;
    }
    //*/
}

混合使用不同版本的屬性。 RoutePrefix來自以前的版本。

每個動作的路由都必須唯一,以避免路由沖突。

例如。

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase {
    // GET api/values        
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get() {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/some_name 
    [HttpGet("{name}")]
    public IActionResult GetByName(string name) {
        return Ok();
    }
}

在ASP.NET Core中參考路由到控制器操作

構建REST API時,很少有人會在操作方法上使用[Route(...)] 最好使用更具體的Http*Verb*Attributes來准確了解您的API支持什么。 期望REST API的客戶端知道哪些路徑和HTTP動詞映射到特定的邏輯操作。

根據提供的其他詳細信息, MarkAsComplete操作應使用HTTP PUT,以表示正在編輯/更新模型。

例如

//* -. space to create a "MarkAsComplete" method
//PUT: api/todo/5
[HttpPut("{id:long}")]        
public async Task<ActionResult<ToDoItem>> MarkAsComplete(long id) {
    var todoitem = await _context.ToDoItems.FindAsync(id);
    if (todoitem == null) {
        return NotFound();
    } else {
        todoitem.IsComplete = true;
    }
    return todoitem;
}
//*/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM