类似于超文本驱动的RESTFUL API:释放超链接的功能
#编程 #node #softwareengineering #restapi

当我们考虑开发Restful API时,经常想到的一个术语是Hateoas(HyperMedia作为应用状态的引擎)。 Hateoas使API能够通过在API响应中包括超链接来指导客户通过应用程序导航。虽然Hateoas是一个有力的概念,但还有另一种设计静止API的方法值得关注:超文本驱动的API。

了解超文本驱动的API
顾名思义,超文本驱动的API利用超文本和超链接来推动客户端与API的互动。与要求客户对资源URI和动作有先验了解的传统API不同,超文本驱动的API提供了API响应中的链接,使客户可以导航和发现资源。

在这种方法中,API充当了一种超媒体文档,不仅提供了数据,还包括指向可以执行的相关资源和动作的链接。这使客户能够动态探索API,而无需依赖硬编码的URL或预定义的导航路径。

现在,在继续阅读之前,您需要安装几件事,以使您开始测试每个示例的代码。

  1. 确保您的计算机上安装了Node.js&npm。您可以从官方网站下载并安装Node.js:https://nodejs.org或npm从https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
  2. 为您的项目创建一个新目录。

  3. 打开终端或命令提示符并导航到项目目录。

  4. 将代码示例复制到新文件中,并使用.js扩展名(例如ecommerce.js)保存。在终端或命令提示符中,通过运行以下命令来安装所需的依赖项:

npm install express
  1. 安装完成后,通过运行以下命令来启动服务器:
node ecommerce.js
  1. 您应该看到一条消息,指示服务器在特定端口上运行(在这种情况下为3000)。

  2. 打开网络浏览器并导航到http://localhost:3000/products以测试产品列表端点。

您应该看到一个包含有关可用产品的信息的JSON响应。

  1. 尝试访问其他端点,例如 /购物车,CART /COBLED1,以测试电子商务平台的不同功能。< /li>

随时探索代码并进行修改以满足您的需求。您可以添加新路由,实现功能以添加/删除购物车中的项目,或与数据库集成以持久数据。

请注意,这是用于测试目的的基本示例。在实际情况下,您需要考虑其他安全措施,处理数据库操作并处理用户身份验证/授权。

重新考虑API相互作用

想象一个电子商务平台的宁静API。传统上,客户需要了解特定的URI来检索产品列表,在购物车中添加物品并进行结帐。使用超文本驱动的API,API响应本身包含这些动作的超链接。

例如,API响应不用依靠固定的URL来检索产品,而是包含与关系类型的链接,客户可以遵循该链接以获取可用产品的列表。同样,响应可能包括将项目添加到购物车或进行结帐的链接。

让我们查看一些代码。

const express = require('express'); 
const app = express(); 
const PORT = 3000; 

app.get('/products', (req, res) => { 
const productData = [{ 
  id: '1', 
  name: 'Product 1', 
  description: 'This is product 1', 
  price: 10.99, 
  imageLink: 'https://via.placeholder.com/150', 
  addToCartLink: '/cart/add/1' }, 

{ 
  id: '2', 
  name: 'Product 2', 
  description: 'This is product 2', 
  price: 19.99, 
  imageLink: 'https://via.placeholder.com/150', 
  addToCartLink: '/cart/add/2' 
}]; 

  res.json(productData); 
}); 

app.get('/cart', (req, res) => {

const cartData = { 
  items: [ { 
  id: '1', 
  name: 'Product 1', 
  description: 'This is product 1', 
  price: 10.99, 
  quantity: 2, 
  imageLink: 'https://via.placeholder.com/150', 
  removeFromCartLink: '/cart/remove/1' } ], 
  subTotal: 21.98, 
  tax: 1.77, 
  total: 23.75, 
  checkoutLink: '/cart/checkout' 
}; 

res.json(cartData); 
}); 


app.get('/cart/checkout', (req, res) => {

const checkoutData = { 
  firstName: 'John', 
  lastName: 'Doe', 
  email: 'johndoe@example.com', 
  address: '123 Main St.',
  city: 'Anytown', 
  state: 'CA', 
  zipCode: '90210', 
  paymentInfoLink: '/cart/payment_info' 
}; 

res.json(checkoutData); 
}); 

app.get('/cart/payment_info', (req, res) => {

const paymentData = { 
  cardNumber: '**** **** **** 1234', 
  expDate: '06/25', cvv: '123', 
  paymentLink: '/cart/submit_payment' 
}; 
res.json(paymentData); 
}); 


app.post('/cart/submit_payment', (req, res) => { // handle payment submission 

res.sendStatus(200); }); 

app.listen(PORT, () => { 
console.log(`Server running on port ${PORT}`); 
});

在上面的示例中,get请求/products返回有关可用产品的信息,包括将每种产品添加到购物车中的超链接。请求/cartreturns的CART信息,包括cart中的项目,次数,税收和结帐超链接。对/cart/checkout的GET请求返回结帐信息,例如计费和运输信息,以及用于输入付款信息的超链接。 /cart/payment_info的获取请求返回输入付款信息的表格,以及提交付款信息的超链接。

通过将整个用户流入较小的资源交互中,每个用户都具有与相关资源的超链接,该电子商务平台可以设计为更灵活和适应性,从而使客户以更动态的方式与API进行交互。

  1. 另一个例子,让我们考虑一个社交网络平台的API。该平台的传统修复API可能具有用于检索用户,帖子和评论的终点,并提供针对这些资源的特定URL和路线。

但是,该平台的超文本驱动的API将包括响应中的超链接,使客户以更动态的方式导航和与API进行交互。

例如,检索用户的响应不仅可以包括用户的配置文件信息,还包括对用户帖子,关注者和以下列表的超链接。客户不用要求客户了解这些资源的URL并进行多个API调用来检索它们,而是可以遵循超链接以访问其他信息和资源。

同样,检索帖子的响应可能包括帖子作者,评论和相关帖子的超链接。客户可以遵循以下链接来探索帖子的上下文并与其他相关资源互动。

通过在响应中加入超链接,社交网络平台的超文本驱动的API可以使用户体验更加互动和无缝。客户可以以更自然和直观的方式探索和与API互动,而不必依靠特定URL和API的先验知识。

获取代码此插图:

const express = require('express'); 
const app = express();

const PORT = 3000; 

app.get('/users/:id', (req, res) => { 

  const userId = req.params.id; 

  const userData = { 
   id: userId, 
   name: 'John Doe', 
   bio: 'Software developer and music lover', 
   postsLink: `/users/${userId}/posts`, 
   followersLink: `/users/${userId}/followers`, 
   followingLink: `/users/${userId}/following` 
};
   res.json(userData); 
}); 


app.get('/users/:id/posts', (req, res) => { 

   const userId = req.params.id; 

   const postsData = [ 
{ 
   id: '1', 
   authorId: userId, 
   content: 'My first post', 
   commentsLink: `/posts/1/comments`, 
   relatedPostsLink: `/users/${userId}/related_posts` 
}, 
{ 
   id: '2', 
   authorId: userId, 
   content: 'My second post', 
   commentsLink: `/posts/2/comments`, 
   relatedPostsLink: `/users/${userId}/related_posts` 
  } 
]; 

res.json(postsData); }); // other endpoints for comments, following, related posts, etc. 


app.listen(PORT, () => { 
console.log(`Server running on port ${PORT}`); 
});

在上面的示例中,对/users/:id的获取请求返回有关特定用户的信息,包括用于访问其帖子,关注者和以下列表的超链接。 get申请/users/:id/帖子返回用户的帖子,以及用于访问评论和相关帖子的超链接。

通过在响应中包括超链接,客户可以动态导航和与API进行交互,而无需依赖硬编码的URL或预定义的导航路径。这简化了客户端开发并促进客户端和服务器组件之间的松散耦合。

超文本驱动的API的好处

提高发现性

超文本驱动的API通过为客户提供探索可用资源和动作的路线图来增强可发现性。客户不再需要依靠API文档或先验知识来浏览API。他们可以简单地遵循链接并让API引导它们。

灵活性和适应性

通过使用超链接来驱动相互作用,超文本驱动的API变得更加灵活和适应性。添加或修改资源和操作不需要更改客户端代码,因为客户端可以通过API响应中提供的超链接动态地发现并与新功能进行交互。

松散的耦合

超文本驱动的API促进客户端和API之间的松散耦合。客户不需要对资源URL或特定API路由的硬编码知识。相反,它依赖于API提供的超链接来导航和交互。这种去耦使API更具弹性对将来的更改,并允许客户端和服务器组件更容易演变。

简化的客户开发

客户与超文本驱动的API互动可以更多地关注业务逻辑和用户体验,因为他们可以将导航和交互方面委托给API本身。这可以简化客户的发展,降低复杂性并提高可维护性。

结论

虽然Hateoas是设计静止API的众所周知的方法,但超文本驱动的API提供了一种强调超链接功能的替代视角。通过将超链接嵌入API响应中,这些API启用动态导航和发现,提高可发现性,灵活性和整体客户体验。

超文本驱动的API授权客户端依靠API提供的指导,从而减少了对硬编码URL和预定义导航路径的需求。这促进了松散的耦合,简化了客户端的开发,并允许客户端和服务器组件更容易地演变。

因此,下次您设计一个恢复的API时,请考虑超文本驱动的API的潜力并包含超链接的力量。让您的API成为HyperMedia文档,可指导客户进行旅途,并解锁全新的灵活性和适应性。

参考:
https://restfulapi.net/hateoas/
https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

关注Twitter