RESTful服务

REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的服务。通过动词(HTTP方法)+名词(请求资源的接口路径)的方式请求资源,赋予接口特定的含义。

REST风格定义了一系列创建HTTP服务的惯例:

  • POST:创建资源
  • PUT:更新资源
  • GET:读取资源
  • DELETE:删除资源

例如:

  • 获取所有书籍: GET /api/books
  • 获取id为1的书籍: GET /api/books/1
  • 更新id为1的书籍:PUT /api/books/1
  • 删除id为1的书籍:DELETE /api/books/1
  • 添加书籍:POST /api/books

Express构建RESTful API

Express.js是一个轻量且灵活的Node.js WEB应用框架,可以快速搭建WEB应用。其底层是对Node.js的HTTP模块进行封装,增加路由、中间件等特性,使得用户能搭建应用级别的WEB服务。

处理GET请求

直接上代码:

const express = require('express');
const app = express();
const Joi = require('joi'); app.use(express.json()); const books = [
{ id: 1, name: 'book1'},
{ id: 2, name: 'book2'},
{ id: 3, name: 'book3'},
]; app.get('/', (req, res) => {
res.end('Hello World!');
});
//获取所有书籍
app.get('/api/books', (req, res) => {
res.json(books).end();
});
//获取特定id的书籍
app.get('/api/books/:id', (req, res) => {
let book = books.find(b => b.id === parseInt(req.params.id));
if(!book) return res.status(404).json({msg: 'The book with the given ID not find.'});
res.json(book).end();
}); const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listening on port ${port}`));

GET /api/books

GET /api/books/2

GET /api/books/5

处理POST请求

function validateBook(book){
const schema = {
name: Joi.string().min(3).required()
}; return Joi.validate(book, schema);
} //使用POST方法添加书籍
app.post('/api/books', (req, res) => {
const {error} = validateBook(req.body);
if(error){
return res.status(400).json({msg: error.details[0].message}).end();
} const book = {
id: books.length + 1,
name: req.body.name
};
books.push(book);
res.json(book).end();
});

POST /api/books



处理PUT请求

//使用PUT方法修改书籍
app.put('/api/books/:id', (req, res) => {
let book = books.find(b => b.id === parseInt(req.params.id));
if(!book) return res.status(404).json({msg: 'The book with the given ID not find.'}); const { error } = validateBook(req.body);
if(error) return res.status(400).json({msg: error.details[0].message}).end(); book.name = req.body.name;
res.json(book).end();
});

PUT /api/books/1

处理DELETE

//使用DELETE方法删除书籍
app.delete('/api/books/:id', (req, res) => {
let book = books.find(b => b.id === parseInt(req.params.id));
if(!book) return res.status(404).json({msg: 'The book with the given ID not find.'}); const index = books.indexOf(book);
books.splice(index, 1); res.json(book).end();
});

DELETE /api/books/1

使用Express构建RESTful API的更多相关文章

  1. 使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  2. Spring MVC中使用 Swagger2 构建Restful API

    1.Spring MVC配置文件中的配置 [java] view plain copy <!-- 设置使用注解的类所在的jar包,只加载controller类 --> <contex ...

  3. SpringBoot 构建RestFul API 含单元测试

    相关博文: 从消费者角度评估RestFul的意义 SpringBoot 构建RestFul API 含单元测试 首先,回顾并详细说明一下在快速入门中使用的  @Controller .  @RestC ...

  4. Springboot 如何加密,以及利用Swagger2构建Restful API

    先看一下使用Swagger2构建Restful API效果图 超级简单的,只需要在pom 中引用如下jar包 <dependency> <groupId>io.springfo ...

  5. springboot集成swagger2构建RESTful API文档

    在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...

  6. 集成swagger2构建Restful API

    集成swagger2构建Restful API 在pom.xml中进行版本管理 <swagger.version>2.8.0</swagger.version> 给taosir ...

  7. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作

    以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Co ...

  8. 使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

    1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文<Archit ...

  9. 使用 Spring Boot 构建 RESTful API

    1. 使用 Idea 创建 Spring Initializer 项目 在创建项目的对话框中添加 Web 和 Lombok,或者建立项目后在 pom.xml 中添加依赖: <dependency ...

随机推荐

  1. 2019.01.13 loj#6515. 贪玩蓝月(线段树分治+01背包)

    传送门 题意简述:有一个初始为空的双端队列,每次可以在队首和队尾插入或弹出一个二元组(wi,vi)(w_i,v_i)(wi​,vi​),支持询问从当前队列中选取若干个元素是的他们的和对 MODMODM ...

  2. 2018.11.18 spoj Triple Sums(容斥原理+fft)

    传送门 这次fftfftfft乱搞居然没有被卡常? 题目简述:给你nnn个数,每三个数ai,aj,ak(i<j<k)a_i,a_j,a_k(i<j<k)ai​,aj​,ak​( ...

  3. PHP获取手机号

    /** * 类名: mobile * 描述: 手机信息类 * 其他: 偶然 编写 */ class mobile{ /** * 函数名称: getPhoneNumber * 函数功能: 取手机号 * ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)

    题目链接:https://nanti.jisuanke.com/t/31443 相关前置链接 https://www.cnblogs.com/dolphin0520/p/3708602.html ht ...

  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记一之铭文升级版

    第一章:课程介绍 铭文一级: VMware Fusion Mac上搭建:为了给大家演示如何使用我们的OOTB环境 Hadoop环境:虚拟机,我是远程登录 Mac 那么就不需要使用我们的OOTB环境 V ...

  6. 大压力下Redis参数调整要点

    调整以下参数,可以大幅度改善Redis集群的稳定性: 为何大压力下要这样调整? 最重要的原因之一Redis的主从复制,两者复制共享同一线程,虽然是异步复制的,但因为是单线程,所以也十分有限.如果主从间 ...

  7. Android自定义视图三:给自定义视图添加“流畅”的动画

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  8. python爬虫之一:requests库

    目录 安装requtests requests库的连接异常 HTTP协议 HTTP协议对资源的操作 requests库的7个主要方法 request方法 get方法 网络爬虫引发的问题 robots协 ...

  9. python list 和 tuple, dict 用于迭代代价

    #!/usr/bin/env python #-*- coding:utf-8 -*- import time start = time.time() for i in range(1000000): ...

  10. VS IDE 中Visual C++ 中的项目属性配置

    VS IDE 中Visual C++ 中的项目属性配置 一. Visual C++ 项目系统基于 MSBuild. 虽然可以直接在命令行上编辑 XML 项目文件和属性表,我们仍建议你使用 VS IDE ...