REST是指表述性状态传递(Representational State Transfer,简称REST),是Roy Fielding 博士在2000年他的博士论文中提出来的一种软件架构风格。
表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。
需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP、URI和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。REST通常使用JSON数据格式。
以下为REST基本架构的四个方法:
GET-用于获取数据。
PUT -用于添加数据。
DELETE-用于删除数据。
POST -用于更新或添加数据。
web Service是一个平台独立的、低耦合的、自包含的、基于可编程的Web的应用程序,可使用开放的XML标准来描述、发布、发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
RESTful是基于REST 架构的wWeb Service。
由于轻量级以及通过HTTP直接传输数据的特性,Web服务的 RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java、C#、Python、PHP和Javascript [包括Ajax ])实现客户端。
例如,我们需要实现订单管理功能,就可以如下设计Web 服务的URL:
HTTP方法 | 示例 | 行为 |
---|---|---|
GET | http://exaple.com/api/orders | 获取订单列表 |
GET | http://exaple.com/api/orders/123 | 获取某个特定订单的信息 |
POST | http://exaple.com/api/orders | 创建新订单 |
PUT | http://exaple.com/api/orders/123 | 更新订单 |
DELETE | http://exaple.com/api/orders/123 | 删除订单 |
{
"user1":{
"id":1,
"name":"张三",
"password":"password",
"profession":"教师"
},
"user2":{
"id":2,
"name":"张三",
"password":"password",
"profession":"教师"
},
"user3":{
"id":3,
"name":"张三",
"password":"password",
"profession":"教师"
}
}
基于以上数据,我们创建以下RESTful API:
URL | HTTP方法 | 发送内容 | 结果 |
---|---|---|---|
listUsers | GET | 空 | 显示用户列表 |
user:id | GET | 空 | 显示用户详细信息 |
addUser | POST | JSON字符串 | 添加新用户 |
delete User:id | DELETE | 空 | 删除用户 |
const { log } = require('console')
const express = require('express')
const app = express()
// fs对象用来操作本地文件 语法与Linux相似
const fs = require('fs')
// get用于获取数据
app.get('/api/users',function(req,res){
fs.readFile(__dirname+'/users.json','utf-8',function(err,data){
if (err) {
res.end("错误")
}else{
res.writeHead(200,{'Content-Type':'Text/plain;charset=utf-8'})
res.end(data)
}
})
})
// post用于添加
let user4={
"id":4,
"name":"张si",
"password":"password",
"profession":"教师"
}
app.post('/api/users',function(req,res){
fs.readFile(__dirname+'/users.json','utf-8',function(err,data){
if (err) {
res.end("错误")
}else{
// 将字符串变成对象(反序列化)
let list = JSON.parse(data)
list['user4']=user4
res.writeHead(200,{'Content-Type':'Type/plain;charset=utf-8'})
// 将对象变成字符串(序列化)
res.end(JSON.stringify(list))
}
})
})
// 动态路由
app.get('/api/users/:id',function(req,res){
fs.readFile(__dirname+'/users.json','utf-8',function(err,data){
if (err) {
res.end("错误")
} else {
// 将字符串转换成对象(反序列化)
// res.end(req)
let list = JSON.parse(data)
let user = list[`user${req.params.id}`]
res.writeHead(200,{'Content-Type':'Type/plain;charset=utf-8'})
res.end(JSON.stringify(user))
}
})
})
// 删除用户
app.delete('/api/users/:id',function(req,res){
fs.readFile(__dirname+'/users.json','utf-8',function(err,data){
if (err) {
res.end("错误")
} else {
let list = JSON.parse(data)
// 删除list对应的id的数据
delete list[`user${req.params.id}`]
res.writeHead(200,{'Contene-Type':'Text/plain;charset=utf-8'})
res.end(JSON.stringify(list))
}
})
})
app.listen(8888)
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
1.mysql中编码和字符
在mysql中,一个中文汉字所占的字节数与编码格式有关:
·如果是GBK编码,则一个中文汉字占2个字节,英文占1个字节
·如果是UTF8编码,则一个中文汉字占3个字节,而英文字母占1字节。
比如定义某个字段数据类型为: varchar(32),表示这个可以存储32个字符,此时表示的是字符,所以跟中英文无关,也就是该字段可以存储32个中文,或者是32个英文,或者是32个中文和英文的混搭都行。但如果字符数超过32个的话就会报错。
2.数值类型
MySQL支持所有标准SQL数值数据类型,mysql 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。并且MySQL允许我们指定数值字段中的值是否有正负之分(UNSIGNED)或者用零填补(ZEROFILL)
在MySQL中支持的5个主要整数类型是TINYINT,SMALLNT,MEDIUMINT,INT和BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。浮点型有:FLOAT、DOUBLE、DECIMAL。
下面的表显示了需要的每个数值类型的存储所占用的字节和可表示的数值范围:
1 bit 即1位 1字节= 8 bit 1K=1024字节 1M= 1024K
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 浮点数值 |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
3.字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295 bytes | 极大文本数据 |
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
类型 | 大小 ( bytes) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' | YYYY-MM-DD hh:mm:ss | 混合日期和时间值 |
TIMESTAMP | 4 | '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
使用命令行进入项目目录,执行以下命令,安装(express-generator :
npm install express-generator -g
执行以下命令,创建一个名为Study的 Express应用,并使用ejs模板引擎:
express --view=ejs Study
进入Study并安装依赖:
cd Study
npm install
使用一下命令启动Express应用:
SET DEBUG=study:* & npm start
express Study -e
cd Study
npm install
不管是Node.js 原生开发,还是借助express等框架开发应用,在对代码做出更新后,都是需要重启服务以生效我们的文件的。为项目添加热加载,可以避免一次次手动的重启操作,节省精力。
开启热加载,我们需要借助一个node.js的开发工具nodemon。运行以下命令来安装它:
npm install -g nodemon
安装好以后,我们就可以通过以下命令启动应用:
nodemon ./bin/www
//nodemon 地址