簡體   English   中英

如何使用類似但不同的參數創建ASP.NET Core Web API控制器方法

[英]How to create ASP.NET Core Web API controller method with similar but different parameter

我使用ASP.NET Core創建了一個簡單的Web API。 我有以下API:

  • GET / api / messages-獲取所有消息
  • GET / api / messages / {id}-通過id獲取消息
  • POST / api / messages-添加新消息
  • PUT / api / messages / {id}-更新現有消息
  • 刪除/ api / messages / {id}-刪除一條消息

現在,我希望另一個API通過消息所有者的名稱獲取所有消息。

我試過了

我嘗試創建此API,但是由於與GET / api / messages / {id}沖突而無法使用:

  • GET / api / messages / {name} <-(由於API沖突而無法使用)

     // GET: api/messages/{name} [HttpGet("{name}")] public IEnumerable<Message> GetMessagesByName(string name) { return _repository.GetMessages().Where(m => m.Owner == name); } 

這是我的消息模型Message.cs

public class Message
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }
    public string Owner { get; set; }
    public string Text { get; set; }
}

這是我的Messages控制器MessagesController.cs

[Route("api/[controller]")]
public class MessagesController : Controller
{
    private readonly IMessageRepository _repository;

    public MessagesController(IMessageRepository repository)
    {
        _repository = repository;
    }

    // GET: api/messages
    [HttpGet]
    public IEnumerable<Message> Get()
    {
        return _repository.GetMessages();
    }

    // GET api/messages/{id}
    [HttpGet("{id}", Name = "GetMessage")]
    public IActionResult GetById(long id)
    {
        var message = _repository.GetMessage(id);
        if (message == null)
        {
            return NotFound();
        }
        return new ObjectResult(message);
    }

    // POST api/messages
    [HttpPost]
    public IActionResult Post([FromBody]Message message)
    {
        if (message == null)
        {
            return BadRequest();
        }

        _repository.AddMessage(message);

        return CreatedAtRoute("GetMessage", new { id = message.Id }, message);

    }

    // PUT api/messages/{id}
    [HttpPut("{id}")]
    public IActionResult Put(long id, [FromBody]Message message)
    {
        if (message == null || message.Id != id)
        {
            return BadRequest();
        }

        var messageToUpdate = _repository.GetMessage(id);
        if (messageToUpdate == null)
        {
            return NotFound();
        }

        messageToUpdate.Owner = message.Owner;
        messageToUpdate.Text = message.Text;

        _repository.UpdateMessage(messageToUpdate);
        return new NoContentResult();
    }

    // DELETE api/messages/{id}
    [HttpDelete("{id}")]
    public IActionResult Delete(long id)
    {
        var message = _repository.GetMessage(id);
        if (message == null)
        {
            return NotFound();
        }
        _repository.RemoveMessage(id);
        return new NoContentResult();
    }
}

問題

如何創建API方法以按消息所有者的名稱獲取所有消息?

理想情況下,我希望該API看起來像GET / api / messages / {name},但認為它不可能,因為它與GET / api / messages / {id}沖突。

我正在考慮像這樣創建API,但不確定如何。

  • GET / api / messages / name / {name} <-(或類似的東西)

解決方案

要使GET / api / messages / {name}正常工作而不與GET / api / messages / {id}沖突, [HttpGet("{id}", Name="GetMessage")]屬性[HttpGet("{id}", Name="GetMessage")]更改為[HttpGet("{id:long}", Name="GetMessage")]表示public IActionResult GetById(long id)方法。

要也使GET / api / messages / name / {name}工作,請將[Route("name/{name}")]屬性添加到public IEnumerable<Message> GetMessagesByName(string name)方法。

您可以將參數類型放入路由中,因此您的代碼方法應如下所示:

 // GET api/messages/{id}
    [HttpGet("{id:long}", Name = "GetMessage")]
    public IActionResult GetById(long id)
    {
        var message = _repository.GetMessage(id);
        if (message == null)
        {
            return NotFound();
        }
        return new ObjectResult(message);
    }

我認為,如果沒有顯式鍵入Web api,則會忽略路由中的參數類型,因此在您的示例中,它具有兩條這樣的路由: api/messages/{object}而當您放置顯式類型時,它們就像這樣: api/messages/{object}api/messages/{long}

暫無
暫無

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

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