不写代码开启Restful服务

news2024/11/24 13:22:17

1 前言

很久没有写文章了,不管什么原因,总觉得心里还是觉得有点焦虑,不看看书写点东西就有莫名的焦虑,仿佛只有忙起来才能忘记焦虑。虽然我也知道更重要的是思考方向,但是就像走路,不出发随着时间的流逝,总觉得有种焦虑感,总觉得一直走在路上,才有踏实的充实感,不知道你们是不是这种感觉,还是只是我的个人感觉。

2 不用写代码的服务器

这篇文章不是什么高深的底层知识,只是介绍个工具。原因我在写后端代码的时候,代码内部需要调用个Restful服务,而这个服务是其他同事开发的,没有开发好。所以我想找个模拟器,类似mock,模拟服务器端进行调试。

很久前有见过一款同事开发的那种模拟tcp的服务器,挺好用的界面版本,可以配置对接收到不同的消息,返回不同的结果,挺好的,找不到了。自己也懒得去写了就在github上找了下,发现一款好用的模拟Restful服务器,尝试下,非常好用,还支持定制。

3 Json-Server

json-server 是用js开发的,作为后端开发者可能对js开发的应用有点排斥,不过尝试了就知道,其实也挺好用,现在我甚至觉得用nodejs开发,其实是件很爽的事情,代码写的像python,简单库还挺丰富的。

3.1 原理

json-server的原理比较简单,后端提供个json文件,然后利用lowdb(一个将json文件当数据库的开源库,参考:https://github.com/typicode/lowdb)作为后端的数据存储服务器做的服务。 举个lowdb的例子:

// Edit db.json content using plain JavaScript
db.data.posts.push({ id: 1, title: 'lowdb is awesome' })

// Save to file
db.write()

// db.json
{
  "posts": [
    { "id": 1, "title""lowdb is awesome" }
  ]
}

在github上有19.8k个star,确实是思路清奇的作品啊。 json-server就是利用lowdb作为后端数据存储服务,然后处理下Restful数据,用图表示如下: json-server原理 图中的Httpie是python写的类似于curl的工具,可以发起http的请求。

3.2 安装和配置

安装方法比较简单,需要通过npm安装(作为java开发人员可以理解为类似maven工具,管理js的包,且可以下载安装依赖包),npm安装的地址为:https://nodejs.org/en

安装好npm就可以安装json-server了,如下命令:

npm install -g json-server
# verify the installation was successful
json-server -v

配置json-server其实比较简单,就是新建个配置文件,上面说了json-server利用lowdb作为后端存储,和我们平时开发利用mysql存储数据没有多少的区别。 所谓的配置就是新建个配置文件,用网上的例子如下:

{
  "wines": [
    { "id": 1, "product""SOMMELIER SELECT",
      "desc""Old vine Cabernet Sauvignon""price": 159.99 },
    { "id": 2, "product""MASTER VINTNER",
      "desc""Pinot Noir captures luscious aromas""price": 89.99 },
    { "id": 3, "product""WINEMAKER'S RESERVE",
      "desc""Merlot featuring complex flavors of cherry""price": 84.99 },
    { "id": 4, "product""ITALIAN SANGIOVESE",
      "desc""Sangiovese grape is famous for its dry, bright cherry character""price": 147.99 }
  ],
  "comments": [
    { "id": 1, "body""like the added grape skins""wineId": 1 },
    { "id": 1, "body""the directions need to be clearer""wineId": 2 },
    { "id": 3, "body""I received 3 different packages of wood chips""wineId": 1 }
  ],
  "profile": { "name""vintnor" }
}

文件命名为db.json,然后我们就可以启动服务了。 简单的启动命令:

F:\jscode\json-server>json-server -w db.json

  \{^_^}/ hi!

  Loading db.json
  Done

  Resources
  http://localhost:3000/posts
  http://localhost:3000/comments
  http://localhost:3000/profile

  Home
  http://localhost:3000

  Type s + enter at any time to create a snapshot of the database
  Watching...

我们可以指定定制的端口,-w 后面带着json文件即是lowdb的存储文件,可以通过-h命令查看json-server支持的参数。

F:\jscode\json-server>json-server -h
bin.js [options] <source>

Options:
  -c, --config                   Path to config file
                                                   [default: "json-server.json"]
  -p, --port                     Set port                        [default: 3000]
  -H, --host                     Set host                 [default: "localhost"]
  -w, --watch                    Watch file(s)                         [boolean]
  -r, --routes                   Path to routes file
  -m, --middlewares              Paths to middleware files               [array]
  -s, --static                   Set static files directory
      --read-only, --ro          Allow only GET requests               [boolean]
      --no-cors, --nc            Disable Cross-Origin Resource Sharing [boolean]
      --no-gzip, --ng            Disable GZIP Content-Encoding         [boolean]
  -S, --snapshots                Set snapshots directory          [default: "."]
  -d, --delay                    Add delay to responses (ms)
  -i, --id                       Set database id property (e.g. _id)
                                                                 [default: "id"]
      --foreignKeySuffix, --fks  Set foreign key suffix (e.g. _id as in post_id)
                                                                 [default: "Id"]
  -q, --quiet                    Suppress log messages from output     [boolean]
  -h, --help                     Show help                             [boolean]
  -v, --version                  Show version number                   [boolean]

Examples:
  bin.js db.json
  bin.js file.js
  bin.js http://example.com/db.json

https://github.com/typicode/json-server

3.3 利用HTTPie来测试服务器

3.3.1 GET请求

HTTPie也是个好玩的python工具,类似于curl,我们这次用它来测试: HTTPie请求示意图

在另外终端输入:

http get http://localhost:3000/wines

显示如下: image.png

可以支持更复杂的查询语法和我们平时写的springboot服务很像: Http请求服务

还支持正则表达式查询:

C:\Users\Think>http get http://localhost:3000/wines?product_like=TWO
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 154
Content-Type: application/json; charset=utf-8
Date: Sat, 22 Jul 2023 07:31:02 GMT
ETag: W/"9a-LGllsaww9QbJMJRaD+BGgkdFcJc"
Expires: -1
Keep-Alive: timeout=5
Pragma: no-cache
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express

[
    {
        "desc""Squeezed rapidly from a delicate, yet pretentious grape",
        "id""5",
        "price""2.99",
        "product""TWO-ISH BUCK CHUCK"
    }
]

查询语法是在字段后面加上_like即可。 不敢相信,还支持全文检索,如下语法:

C:\Users\Think>http get http://localhost:3000/wines?q=yet
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 154
Content-Type: application/json; charset=utf-8
Date: Sat, 22 Jul 2023 07:32:52 GMT
ETag: W/"9a-LGllsaww9QbJMJRaD+BGgkdFcJc"
Expires: -1
Keep-Alive: timeout=5
Pragma: no-cache
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express

[
    {
        "desc""Squeezed rapidly from a delicate, yet pretentious grape",
        "id""5",
        "price""2.99",
        "product""TWO-ISH BUCK CHUCK"
    }
]

3.3.2 POST请求添加数据

image.png
image.png

我们可以利用POST方法添加一条数据:

http POST localhost:3000/wines id=5 product="TWO BUCK CHUCK" price=2.99 desc="Squeezed rapidly from a delicate, yet unpretentious grape"

增加后通过id查询:

http get http://localhost:3000/wines/5
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 136
Content-Type: application/json; charset=utf-8
Date: Sat, 22 Jul 2023 07:24:09 GMT
ETag: W/"88-BPC094++pBcIJDHh/bbFUYN5tzY"
Expires: -1
Keep-Alive: timeout=5
Pragma: no-cache
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express

{
    "desc""Squeezed rapidly from a delicate, yet unpretentious grape",
    "id""5",
    "price""2.99",
    "product""TWO BUCK CHUCK"
}
POST请求
POST请求

3.3.3 PUT请求修改数据

image.png
image.png

PUT请求修改数据命令如下:

http PUT localhost:3000/wines/5 product="TWO-ISH BUCK CHUCK" price=2.99 desc="Squeezed rapidly from a delicate, yet pretentious grape"
PUT请求
PUT请求

3.3.4 删除数据

删除数据
删除数据
http DELETE localhost:3000/wines/5
删除服务
删除服务

4 简单的定制

如果我们需要授权访问,或需要很多定制数据,而且数据要是自己可以定制的,这时候就只能通过编码完成了,比如生成一千条数据

// index.js
module.exports = () => {
  const data = { users: [] }
  // Create 1000 users
  for (let i = 0; i < 1000; i++) {
    data.users.push({ id: i, name: `user${i}` })
  }
  return data
}

运行:

$ json-server index.js

测试:

C:\Users\Think>http get localhost:3000/users/1
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 32
Content-Type: application/json; charset=utf-8
Date: Sat, 22 Jul 2023 07:52:06 GMT
ETag: W/"20-UdPmwiEpoycb9u2K15k2zz81mIU"
Expires: -1
Keep-Alive: timeout=5
Pragma: no-cache
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express

{
    "id": 1,
    "name""user1"
}

对于我来说关键是定制请求和服务,可以通过下面的代码来实现:

const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('db.json')
const middlewares = jsonServer.defaults()
const { v4: uuidv4 } = require('uuid');

// Set default middlewares (logger, static, cors and no-cache)
server.use(middlewares)

const probeId = uuidv4();
console.log(probeId)


const registerResponse = {
    "resultMessage":"注册成功",
    "resultCode": 0,
    "time": Date.now()/1000,
    "data" : {
        "id""3KhOenUhjFI7Eg2A0Ovvr396SX2WIO8kgGvxMPvd8EHsu8Y2/mp3DMHy1DPoX0pX"
    }
}

const heartbeatResponse = {
    "resultMessage":"操作成功",
    "resultCode": 0,
    "time": Date.now()/1000
}


// Add custom routes before JSON Server router
server.get('/echo', (req, res) => {
  res.jsonp(req.query)
})

server.post('/manage/register', (req, res) => { 
  res.jsonp(registerResponse)
})

server.post('/manage/heartbeat',(req,res) => {
  res.jsonp(heartbeatResponse)
})



// To handle POST, PUT and PATCH you need to use a body-parser
// You can use the one used by JSON Server
server.use(jsonServer.bodyParser)
server.use((req, res, next) => {
  if (req.method === 'POST') {
    req.body.createdAt = Date.now()
  }
  // Continue to JSON Server router
  next()
})

// Use default router
server.use(router)
server.listen(3000, () => {
  console.log('JSON Server is running')
})

虽然代码比较长,但是大部分都是官方的例子的,定制的消息地方是:

// Add custom routes before JSON Server router
server.get('/echo', (req, res) => {
  res.jsonp(req.query)
})

server.post('/manage/register', (req, res) => { 
  res.jsonp(registerResponse)
})

server.post('/manage/heartbeat',(req,res) => {
  res.jsonp(heartbeatResponse)
})

不得不说nodejs对json的处理实在是太方便了,代码要正常运行还需要安装开发包:

$ npm install json-server --save-dev

运行定制服务:

F:\jscode\json-server\json>node server.js
JSON Server is running

测试,将请求的json放入文件hearbeat.json中,内容如下:

{"id":"3KhOenUhjFI7Eg2A0Ovvr396SX2WIO8kgGvxMPvd8EHsu8Y2/mp3DMHy1DPoX0pX","encryptTime":"ksySo5ll7c5kg0DGr9FF4Q==","time":"1690013067"

请求命令如下:

F:\jscode\json-server\json>http -x post 127.0.0.1:3000/manage/heartbeat  =@heartbeat.json
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 82
Content-Type: application/json; charset=utf-8
Date: Sat, 22 Jul 2023 08:19:09 GMT
ETag: W/"52-BOhF+g6Q+Rj2eKLuULBssIjnupA"
Expires: -1
Keep-Alive: timeout=5
Pragma: no-cache
Vary: Origin, Accept-Encoding
X-Content-Type-Options: nosniff
X-Powered-By: Express

{
    "resultCode": 0,
    "resultMessage""操作成功",
    "time": 1690012803.145
}

可以看到,我们完成了消息定制的功能。

好,打完手工。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MacBook外接键盘修改键位

众所周知&#xff0c;MacBook的键盘和Windows差别很大&#xff0c;比如我们最常用的ctrlcv在Mac下是commandcv…而外接键盘往往是Windows布局&#xff0c;因此如何修改外接键盘键位就是一件很重要的事情&#xff01; 首先&#xff0c;我们要知道Win键在Mac系统中是多余的&…

微服务一 实用篇 - 5.分布式搜索引擎(ElasticSearch基础)

《微服务一 实用篇 - 5.分布式搜索引擎&#xff08;ElasticSearch基础&#xff09;》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 5.分布式搜索引擎&#xff08;ElasticSearch基础&#xff09;》 《微服务一 实用篇 - 5.分布式搜索…

mysql悲观锁与乐观锁、死锁

mysql悲观锁与乐观锁、死锁 乐观锁的缺点 这个策略源于 mysql 的 mvcc 机制&#xff0c;使用这个策略其实本身没有什么问题&#xff0c;主要的问题就是**对数据表侵入较大&#xff0c;我们要为每个表设计一个版本号字段&#xff0c;然后写一条判断 sql 每次进行判断&#xff…

k8s Service网络详解(一)

有关K8s网络的几个概念 Service&#xff1a;服务 Endpoint&#xff1a;端点 Ingress&#xff1a;和Service类似&#xff0c;基于OSI&#xff08;Open System Interconnection&#xff09;网络模型的七层协议数据&#xff08;如HTTP&#xff09;的转发 Kube Proxy&#xff1…

155、基于STM32单片机老人防跌倒摔倒GSM短信报警系统ADXL345加速度设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 单片机主芯片选…

【C语言初阶】指针的运算or数组与指针的关系你了解吗?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《快速入门C语言》《C语言初阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 指针运算&#x1f4ad; 指针-整数&#x1f4ad; 指针-指针&#x1f4ad; 指针…

类和对象(中)--运算符重载

目录 1.运算符重载①运算符重载的概念②日期类和运算符重载 2.赋值运算符重载3. 流插入运算符<<重载4.Date类实现5.const成员6.取地址及const取地址操作符重载 1.运算符重载 大家有没有想过内置类型可以使用的运算符是否自定义类型的成员变量也可以使用呢&#xff1f; …

pyqt5-多行文本区QTextEdit实现鼠标滚轮调整文本大小

核心 在 PyQt5 中&#xff0c;你可以通过处理鼠标滚轮事件来设置 QTextEdit 的字体大小。具体做法是在 QTextEdit 上重新实现 wheelEvent 方法&#xff0c;并根据滚轮方向调整字体大小。 代码 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5…

MATLAB 最小二乘法拟合直线点云 方法一 (26)

MATLAB 最小二乘法拟合直线点云 方法一 (26) 一、算法简介二、算法实现1.代码(详细注释)2.结果展示2.1 拟合效果可视化2.2 对比拟合系数与实际值一、算法简介 提供一组点云(x1 y1 )(x2 y2 )(x3 y3 )…等等多个点… 算法自动拟合直线方程 二维点云的直线方程为:y=kx+…

Mac 预览(Preview)丢失PDF标注恢复

感谢https://blog.csdn.net/yaoyao_chen/article/details/127462497的推荐&#xff01; 辛苦用预览在pdf上做的阅读标记&#xff0c;关闭后打开全丢失了&#xff0c;推荐尝试下网站导入文件进行恢复&#xff1a; 直接使用该网页应用PDF Annotation Recovery 或者访问该项目&a…

在 Windows 中通过 WSL 2 高效使用 Docker

大家好&#xff0c;我是比特桃。平时开发中&#xff0c;不免会使用一些容器来跑中间件。而开发者使用的操作系统&#xff0c;大多是Mac OS 、Windows。Docker 为了兼顾这两个平台的用户&#xff0c;推出了 Docker Desktop 应用。Docker Desktop 中的内核还是采用了 Linux 的内核…

swift简单弹幕例子,仿哔哩哔哩

先看例子 每个弹幕的速度都是不一样的&#xff0c;支持弹幕整体开始暂停。 如果弹幕实在是太多了&#xff0c;有个缓冲队列&#xff0c;不停的重试能否显示&#xff0c;保证文字都能显示全&#xff0c;并且每条都能显示。 实现是基于 CADisplayLink 实现的&#xff0c;如此来…

mac使用教程【快速从windows切换为mac,mac快捷键合集】

mac使用教程 1. 安装brew并通过brew安装git 1.1 安装brew 打开终端输入如下命令&#xff1a; % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"选择对应的镜像进行安装 # 例如&#xff1a;输入5&#xff…

了解 3DS MAX 3D摄像机跟踪设置:第 5部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建陨石坑 步骤 1 启动 3ds Max 和 打开本教程最后一部分中保存的文件。 启动 3ds Max 步骤 2 删除所有占位符 从头开始创建陨石坑。 删除所有占位符 步骤 3 创建具有“长度”的平面 段和宽度段各…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI&#xff1a; npm install -g vue/cli 如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 选择vue2 …

【mysql】聚簇索引和非聚簇索引(B树和B+树)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: mysql 目录 一、索引分类 二、索引的数据结构 2.1 B树&#xff1a;改造二叉树 2.2 B树&#xff1a;改造B树 三、Mysql索引实现—InnoDB引擎 3.1 主键索引&#xff08;聚簇索引&#xff09; 3.2 …

如何利用plotly和geopandas根据美国邮政编码(Zip-Code)绘制美国地图

对于我自己来说&#xff0c;该需求源自于分析Movielens-1m数据集的用户数据&#xff1a; UserID::Gender::Age::Occupation::Zip-code 1::F::1::10::48067 2::M::56::16::70072 3::M::25::15::55117 4::M::45::7::02460 5::M::25::20::55455 6::F::50::9::55117我希望根据Zip-…

Python读写csv文件

简介 通过Python内置csv模块&#xff0c;可以读取和写入CSV&#xff08;逗号分隔值&#xff09;文件。 CSV是一种常见的文件格式&#xff0c;通常用于存储表格数据&#xff0c;每行数据由逗号分隔&#xff0c;每个字段可以用引号括起来。 测试文件内容如下 列号,年龄,姓名,性别…

香橙派Zero2安装wiringPi外设库

安装wiringOP库 直接在香橙派上下载 wiringOP 的代码 sudo apt update sudo apt install -y git git clone https://github.com/orangepi-xunlong/wiringOP 如果在香橙派上下载不下来&#xff0c;也可以在通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP …

【【高级程序设计语言C++】C++多态的概念及原理

1. 多态的概念2. 多态的定义及实现2.1. 多态的条件2.2. 虚函数2.3. 虚函数的重写2.4. 虚函数重写的两个例外2.5. C11的override和final2.6. 重载、重写、重定义的对比 3. 抽象类3.1. 概念3.2. 实现继承和接口继承的对比 4. 多态的原理4.1. 虚函数表4.2. 多态原理4.3. 动态绑定和…