REST标准与身体参数

时间:2017-09-29 02:14:16

标签: rest asp.net-web-api standards

我需要使用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标准?

1 个答案:

答案 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