我需要使用WebAPI进行休息交易。 我试图弄清楚如何将复杂的请求参数传递到请求体中,并且还要遵守Rest标准,例如。
GET方法是一种安全的方法(或nullipotent),这意味着调用它不会产生副作用:检索或访问记录不会改变它。 PUT和DELETE方法是幂等的,这意味着无论多次重复相同的请求,API公开的系统状态都不会改变。 POST不是幂等的。
以下是我提出的标准,其中q是查询参数,b是复杂的身体参数:
Get Get(q) Get(q,b)
HttpGet HttpGet HttpPut
Create Create(b) Create(q,b)
HttpPost HttpPost HttpPost
Update(q,b)
HttpPut
Delete(q) Delete(q,b)
HttpDelete HttpPut
这种模式是否真的尊重REST标准?
答案 0 :(得分:0)
REST并没有真正的标准,它更像是一种风格。
只要你有一些资源并坚持使用动词,那么你就足够了,我会说。
在请求正文中传递复杂对象与REST无关。 想象一下,您想要创建一个实体Employee。
你有一个/ employee或/ employee的URL,如果你想复数或不复数,这取决于你,但无论你决定什么,都要保持一致。
您向/ employee发出一个POST,并且在Body中您拥有创建一个实体所需的所有详细信息。您的身体数据将是您拥有的任何复杂性的JSON表示。
如果要更新对象,请发出PUT。
从目前的情况来看,很难说出你想要的东西。
让我们看看Create(b)。
如果你的意思是这样的话,那就是好的:
[POST]
Public IHttpActionResult Create([FromBody]b)
{
//some code
//I personally like to return the id of the created entity
// but sometimes you might want to return the entire entity,
//should you need that or only a few fields, all options are valid and
//depend on your circumstances
return OK(id);
or
return Ok(createdEntity)
}
创建网址时,请确保您没有动词
例如/ createEmployee这样的东西就不行了PUT请求 /雇员/ 45 /地址/ 1
我的书中可以更新特定员工的特定地址
或PUT到/ employee / 45这也可以更新该员工
GET to / employee返回所有员工 GET到/ employee / 45只返回一个匹配id