什么是RESTful API的Richardson成熟度模型? - readlearncode

20-10-10 banq

这个模型是由伦纳德·理查森(Leonard Richardson)开发的,试图根据对REST施加约束的遵守程度对API进行分类。分类有四个级别:最低的是级别0,它表示不那么兼容的实现,最高的是级别3,它是最兼容的,因此也是最RESTful的。

 

级别0:POX(普通的旧XML)的沼泽

使用HTTP协议作为传输方式,但类似于经典RPC的应用程序状态,经典RPC有:SOAP和XML-RPC,

举例说明:就像去镇上唯一的外卖餐厅,订购比萨饼,炒饭和咖喱

自然语言:

  • 客户:您提供哪种食物?
  • 餐厅:我们提供意大利美食,例如比萨饼和馅饼,中国美食,例如炒饭和虾饼干,以及印度美食,包括咖喱和波普托饼。
  • 客户:太好了。我想要一个比萨饼,一些炒饭和一个咖喱
  • 餐厅:这是您的比萨饼,炒饭和咖喱

API代码:

GET/FoodService HTTP 1.1

{
"action" : "GetFoodServed"
}
HTTP 1.1 200 OK

{
  "Italian": [ "pizza", "calzone" ],
  "Chinese": [ "fried rice", "prawn crackers" ],
  "Indian": [ "curry", "poppadoms" ]
}
GET/FoodService HTTP 1.1

{
  "action": "MakeFoodOrder",
  "order": [ "pizza", "fried rice", "curry" ]
}
HTTP 1.1 200 OK

{
  "order": [ "pizza", "fried rice", "curry" ]
}

 

级别1:资源

区分不同的资源,但使用一种HTTP方法。

举例:喜欢去不同的外卖餐厅,在意大利餐厅订购比萨饼,在中国餐厅订购炒饭,在印度餐厅订购咖喱。

自然语言:

  • 客户:(去披萨餐厅)我想要一个比萨饼,里面有意大利辣香肠和额外的奶酪馅料。
  • 餐厅:好。这是你的披萨。那将是15英镑。
  • 顾客:(去中国餐馆)我要炒饭
  • 餐馆:好的。这是你的米饭。那将是2.50英镑。
  • 顾客:(去印度餐厅)我要咖喱
  • 餐厅:好的。这是你的咖喱。那将是5.60英镑。

API代码:

POST/restaurants/italian/orders HTTP 1.1

{
  "order": [{
    "item": "pizza",
    "quantity": 1
  }]
}
HTTP 1.1 200 OK

{
  "order": [{
    "orderNo": "123456",
    "item": "pizza",
    "toppings": [ "pepperoni", "extra cheese" ],
    "quantity": 1
  }],
  "total": "£15.00"
}
POST/restaurants/chinese/orders HTTP 1.1

{
  "order": [{
    "item": "fried rice",
    "quantity": 1
  }]
}
HTTP 1.1 200 OK

{
  "order": [{
    "orderNo": "AW76W09",
    "item": "fried rice",
    "quantity": 1
  }],
  "total": "£2.50"
}
POST/restaurants/indian/orders HTTP 1.1

{
  "order": [{
    "item": "curry",
    "quantity": 1
  }]
}
HTTP 1.1 200 OK

{
  "order": [{
    "orderNo": "89GY7QW8",
    "item": "fried rice",
    "quantity": 1
  }],
  "total": "£5.60"
}

 

级别2:HTTP动词

充分利用所有HTTP动词和资源名词。

j举例:就像去意大利餐厅并指定比萨饼馅料,然后去中国餐厅取消炒饭,然后去印度餐厅更改poppadoms的数量。

自然语言:

  •  
  • 客户:(去披萨店)我要披萨。
  • 餐厅:好。这是你的披萨。那将是15英镑。
  • 顾客:(去中国餐馆)我要炒饭
  • 餐馆:好的。这是你的米饭。那将是2.50英镑。
  • 客户:(返回比萨餐厅)我想更改订单并添加额外的浇头。我要橄榄和凤尾鱼。哦,做两个比萨。
  • 餐厅:好的,我们可以做到。给我们您的披萨,我们将添加这些浇头。
  • 顾客:(去一家印度餐馆)我要咖喱和两个poppadoms。
  • 餐厅:好的,这是您的订单。那将是8.20英镑。
  • 顾客:我改变了主意。我只想取消订单。
  • 餐厅:好。您的新产品已被取消。

API代码:

PUT/restaurants/italian/orders/123456 HTTP 1.1

{
  "order": [{
    "items": [{
      "item": "pizza",
      "toppings": [ "pepperoni", "extra cheese",
                    "olives", "anchovies" ],
      "quantity": 2
    }]
  }]
}
HTTP 1.1 200 OK

{
  "order": [{
    "items": [{
      "item": "pizza",
      "toppings": [ "pepperoni", "extra cheese",
                    "olives", "anchovies" ],
       "quantity": 2
    }]
  }],
  "orderNo": "123456",
  "total": "£34.00"
}
POST/restaurants/indian/orders HTTP 1.1

{
  "order": [{
    "items": [{
      "item": "curry",
      "quantity": 1
    },{
    "item": "poppadoms",
    "quantity": 2
    }]
  }]
}

HTTP 1.1 200 OK

{
  "order": [{
    "items": [{
      "item": "curry",
      "quantity": 1
    },{
    "item": "poppadoms",
    "quantity": 2
    }]
  }],
  "orderNo": "89GY7QW8",
  "total": "£5.60"
}

DELETE /restaurants/indian/orders/89GY7QW8 HTTP 1.1

HTTP 1.1 200 OK

{
  "order": [{
    "items": [{
      "item": "curry",
      "quantity": 1
    },{
    "item": "poppadoms",
    "quantity": 2
    }]
  }],
  "orderNo": "89GY7QW8",
  "total": "£5.60"
}

 

级别3:超媒体控件

使用HATEOAS(超媒体作为应用程序状态的引擎)指导应用程序状态。

举例:就像去披萨餐厅订购披萨,然后服务员为您带来披萨,然后告诉您您刚刚订购了什么,还有哪些其他披萨以及如何获取有关每个披萨的更多信息。

自然语言:

  • 客户:(去披萨店)我要披萨。
  • 餐厅:这是您的披萨。您点了一份意大利辣香肠比萨饼。您想知道我们还有哪些额外的浇头吗?我们还有其他比萨饼:玛格丽特(Margherita),四个季节和四个奶酪。您想要有关每个人的更多信息吗?

API代码:

POST/restaurants/italian/orders HTTP 1.1

{
  "order": [{
    "items": [{
      "item": "pizza",
      "toppings": [ "pepperoni", "extra cheese" ],
      "quantity": 1
    }]
  }]
}
HTTP 1.1 200 OK

{
  "response": [{
    "order": [{
      "items": [{
        "item": "pizza",
        "toppings": [ "pepperoni",
                      "extra cheese" ],
        "quantity": 1
      }]
    }],
    "orderNo": "123456",
    "total": "£17.00"
  }],
  "links": [{
    "rel": "self",
    "href": "/restaurants/italian/orders/89GY7QW8",
    "method": "GET"
  },{
  "rel": "toppings",
  "href": "/restaurants/italian/toppings",
  "method": "GET"
  },{
  "rel": "delete_order",
  "href": "/restaurants/italian/orders/89GY7QW8",
  "method": "DELETE"
  }]
}

 

                   

1
猜你喜欢