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


这个模型是由伦纳德·理查森(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"
  }]
}