首页 > 其他分享 >编写REST API

编写REST API

时间:2023-03-11 15:01:33浏览次数:25  
标签:API body Product 请求 ctx REST api products 编写

REST API规范

编写REST API,实际上就是编写处理HTTP请求的async函数,不过,REST请求和普通的HTTP请求有几个特殊的地方:

  1. REST请求仍然是标准的HTTP请求,但是,除了GET请求外,POST、PUT等请求的body是JSON数据格式,请求的​​Content-Type​​为​​application/json​​;
  2. REST响应返回的结果是JSON数据格式,因此,响应的​​Content-Type​​也是​​application/json​​。

REST规范定义了资源的通用访问格式,虽然它不是一个强制要求,但遵守该规范可以让人易于理解。

例如,商品Product就是一种资源。获取所有Product的URL如下:

GET /api/products

而获取某个指定的Product,例如,id为​​123​​的Product,其URL如下:

GET /api/products/123

新建一个Product使用POST请求,JSON数据包含在body中,URL如下:

POST /api/products

更新一个Product使用PUT请求,例如,更新id为​​123​​的Product,其URL如下:

PUT /api/products/123

删除一个Product使用DELETE请求,例如,删除id为​​123​​的Product,其URL如下:

DELETE /api/products/123

资源还可以按层次组织。例如,获取某个Product的所有评论,使用:

GET /api/products/123/reviews

当我们只需要获取部分数据时,可通过参数限制返回的结果集,例如,返回第2页评论,每页10项,按时间排序:

GET /api/products/123/reviews?page=2&size=10&sort=time

koa处理REST

既然我们已经使用koa作为Web框架处理HTTP请求,因此,我们仍然可以在koa中响应并处理REST请求。

我们先创建一个​​rest-hello​​的工程,结构如下:

rest-hello/
|
+- .vscode/
| |
| +- launch.json <-- VSCode 配置文件
|
+- controllers/
| |
| +- api.js <-- REST API
|
+- app.js <-- 使用koa的js
|
+- controller.js <-- 扫描注册Controller
|
+- package.json <-- 项目描述文件
|
+- node_modules/ <-- npm安装的所有依赖包

在​​package.json​​中,我们需要如下依赖包:

"dependencies": {
"koa": "2.0.0",
"koa-bodyparser": "3.2.0",
"koa-router": "7.0.0"
}

运行​​npm install​​安装依赖包。

在​​app.js​​中,我们仍然使用标准的koa组件,并自动扫描加载​​controllers​​目录下的所有js文件:

const app = new Koa();

const controller = require('./controller');

// parse request body:
app.use(bodyParser());

// add controller:
app.use(controller());

app.listen(3000);
console.log('app started at port 3000...');

注意到​​app.use(bodyParser());​​这个语句,它给koa安装了一个解析HTTP请求body的处理函数。如果HTTP请求是JSON数据,我们就可以通过​​ctx.request.body​​直接访问解析后的JavaScript对象。

下面我们编写​​api.js​​,添加一个GET请求:

// 存储Product列表,相当于模拟数据库:
var products = [{
name: 'iPhone',
price: 6999
}, {
name: 'Kindle',
price: 999
}];

module.exports = {
'GET /api/products': async (ctx, next) => {
// 设置Content-Type:
ctx.response.type = 'application/json';
// 设置Response Body:
ctx.response.body = {
products: products
};
}
}

在koa中,我们只需要给​​ctx.response.body​​赋值一个JavaScript对象,koa会自动把该对象序列化为JSON并输出到客户端。

我们在浏览器中访问​​http://localhost:3000/api/products​​,可以得到如下输出:

{"products":[{"name":"iPhone","price":6999},{"name":"Kindle","price":999}]}

紧接着,我们再添加一个创建Product的API:

module.exports = {
'GET /api/products': async (ctx, next) => {
...
},

'POST /api/products': async (ctx, next) => {
var p = {
name: ctx.request.body.name,
price: ctx.request.body.price
};
products.push(p);
ctx.response.type = 'application/json';
ctx.response.body = p;
}
};

这个POST请求无法在浏览器中直接测试。但是我们可以通过​​curl​​命令在命令提示符窗口测试这个API。我们输入如下命令:

curl -H 'Content-Type: application/json' -X POST -d '{"name":"XBox","price":3999}' http://localhost:3000/api/products

得到的返回内容如下:

{"name":"XBox","price":3999}

我们再在浏览器中访问​​http://localhost:3000/api/products​​,可以得到更新后的输出如下:

{"products":[{"name":"iPhone","price":6999},{"name":"Kindle","price":999},{"name":"XBox","price":3999}]}

可见,在koa中处理REST请求是非常简单的。​​bodyParser()​​这个middleware可以解析请求的JSON数据并绑定到​​ctx.request.body​​上,输出JSON时我们先指定​​ctx.response.type = 'application/json'​​,然后把JavaScript对象赋值给​​ctx.response.body​​就完成了REST请求的处理。

标签:API,body,Product,请求,ctx,REST,api,products,编写
From: https://blog.51cto.com/u_15692628/6114600

相关文章

  • 使用velero+minio+restic实现kubernetes业务数据备份与恢复
    概述:Velero(以前称为HeptioArk)为您提供了备份和恢复Kubernetes集群资源和持久卷的工具,可以安全的备份、恢复和迁移Kubernetes集群资源和持久卷。Velero主要提供以下能力......
  • WebApi问题与跨域和返回json
    1、编写接口时,发现访问不到指定接口注释掉[Authorize]特性给方法设置访问方式,已经指定路由方法如下2、出现一下跨域问题在web.config里面配置2、返回类型指定接口......
  • odoo ORM API学习总结兼orm学习教程
    环境odoo-14.0.post20221212.tarORMAPI学习总结/学习教程模型(Model)Model字段被定义为model自身的属性fromodooimportmodels,fieldsclassAModel(models.Model......
  • GenericAPIView的9个视图子类
    1.基于GenericAPIView下的9个视图子类功能关系梳理fromrest_framework.genericsimportCreateAPIView,ListAPIView,UpdateAPIView,RetrieveAPIView,DestroyAPIView,......
  • vue3请求编写规范
    vue3请求编写规范使用的是模块化的组件式API界面request(请求文件夹)总文件夹中包含了对应的接口文件xxxx.ts包含了管理最底层请求的request.ts包含了......
  • 如何从SPFx Solution连接old API,为Viva Connections构建web部件、扩展、团队应用程序
    Yammer现在更名为VivaEngage,在本文中,我将介绍如何从SPFxSolution连接oldAPI,为VivaConnections构建web部件、扩展、团队应用程序等。关于授权VivaEngage权限,请参照上一......
  • 精通api,07文件目录
    DeleteFile,CopyFile,MoveFile来完成文件的删除,复制和移动功能.带Ex为增强版.整主(整参个数,p符参值[]){//-d参数,删除文件.如(0==长比较串("-d",参值[1])......
  • 使用select 封装 socket api
    common_socket.h#ifndef__COMMSOCKET_H_#define__COMMSOCKET_H_#ifdef__cplusplusextern'C'{#endiftypedefstruct_socket_handle{in......
  • ABP 动态 WebApi 隐藏接口的方法(一)
    在ABP实际开发过程中既有可能会遇到不希望将某些方法暴露,那么就需要想办法将接口隐藏起来。方法一:通过修改修饰符实现。例如将方法修改为private,这种方式比较常用。但这......
  • yapi - 接口管理平台搭建
    YApi是比较好用的接口管理平台,通过docker-compose搭建记录。准备工作CentOSLinuxrelease7.9.2009(Core)Docker20.10.8搭建1.创建容器网络$dockernetwor......