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; }
}
}