0
为什么每个Web API操作都需要用例如默认启用Web API的所有http动词?
[AcceptVerbs("Get", "Post")]
要具体接受Get和Post?是否有一种方法可以全局允许所有动词进行所有动作,而不依赖方法名称的Get或Post Prefeix?
尽管还有其他的做事方式,为了将动词绑定到动作上,为什么不允许所有的动作都在需要时限制它们呢?
为什么每个Web API操作都需要用例如默认启用Web API的所有http动词?
[AcceptVerbs("Get", "Post")]
要具体接受Get和Post?是否有一种方法可以全局允许所有动词进行所有动作,而不依赖方法名称的Get或Post Prefeix?
尽管还有其他的做事方式,为了将动词绑定到动作上,为什么不允许所有的动作都在需要时限制它们呢?
默认情况下未启用该功能的原因是它会破坏您的RESTful api。
如果您默认启用了所有动词,那么将无法确定要使用哪个动作。
让我们举个例子,你有一个包含4种方法UsersController
:Get all users
,Get specific user
,Post user
和Delete user
。这些方法只会导致两个不同的端点,并且WebApi引擎能够选择正确的方法,它需要HTTP动词。
UsersController
[RoutePrefix("api/users")]
public class UsersApiController : ApiController
{
[Route("")]
public IHttpActionResult Get()
{
var result = _userRepository.GetAll();
return Ok(result);
}
[Route("{id:guid}")]
public IHttpActionResult Get(Guid id)
{
var result = _userRepository.GetById(id);
if (result == null)
return NotFound();
return Ok(result);
}
[Route("")]
public IHttpActionResult Post([FromBody]UserPostModel model)
{
var user = new User(model.FirstName, model.LastName);
_userRepository.Add(user);
return Created<User>(Request.RequestUri + user.Id.ToString(), user);
}
[Route("{id:guid}")]
public IHttpActionResult Delete(Guid id)
{
var result = _userRepository.Delete(id);
if (!result)
return BadRequest();
return Ok();
}
public class UserPostModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class User
{
public User(string firstName, string LastName)
{
Id = Guid.NewGuid();
FirstName = firstName;
LastName = lastName;
}
public Guid Id { get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
}
}