[英]How to create ASP.NET Core Web API controller method with similar but different parameter
我使用ASP.NET Core創建了一個簡單的Web API。 我有以下API:
現在,我希望另一個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}正常工作而不與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.