#json #fake #mocking #serde-json #api #server

app weldmock

完整的模拟 REST API 生成器

3 个版本

使用旧的 Rust 2015

0.0.1-alpha.52018 年 3 月 2 日
0.0.1-alpha.42018 年 2 月 26 日
0.0.1-alpha.32017 年 11 月 27 日

#1217 in 编码

MIT/Apache

81KB
2K SLoC

焊接

完整的模拟 REST API 生成器。

weldmock' current version badge Build Status codecov

该项目深受 json-server 启发,用 Rust 编写。

概要

我们的首要目标是根据给定的数据源(JSON)生成一个模拟 API。它可能存在错误、缺失的功能,但如果您做出贡献,所有这些都会得到修复。

版本 CHANGELOG

技术

  • Serde 用于 json 解析。
  • Hyper 用于服务。
  • slog 用于日志记录。

安装

  1. 从这里下载并安装 Rusthere
  2. 从这里下载并安装 Cargohere
  3. 克隆并运行项目。
git clone https://github.com/serayuzgur/weld.git
cd weld
cargo run

使用方法

运行

可执行文件可以接受配置路径,否则它将使用默认的 ./weld.json。如果我们以项目文件夹作为根目录,命令应该看起来像以下之一。如果您使用 cargo build --release 版本,将 debug 更改为 release

./target/debug/weld  
./target/debug/weld weld.json
./target/debug/weld <path_to_config>.json

./target/release/weld  
./target/release/weld weld.json
./target/release/weld <path_to_config>.json

配置

配置文件是一个非常简单的 json 文件,用于保存服务器和数据库属性。

{
    "server": {
        "host": "127.0.0.1",
        "port": 8080
    },
    "database": {
        "path": "db.json"
    }
}

数据库

数据库是一个简单的 json 文件。

{
    "owner": {
        "name": "seray",
        "surname": "uzgur"
    },
    "posts": [
        {
            "author": {
                "name": "seray",
                "surname": "uzgur"
            },
            "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
            "id": 1,
            "tags": [
                {
                    "id": 1,
                    "name": "tech"
                },
                {
                    "id": 2,
                    "name": "web"
                }
            ],
            "title": "Rust Rocks!"
        },
        {
            "author": {
                "name": "kamil",
                "surname": "bukum"
            },
            "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
            "id": 2,
            "tags": [
                {
                    "id": 1,
                    "name": "tech"
                },
                {
                    "id": 2,
                    "name": "web"
                }
            ],
            "title": "TypeScript is Awesome"
        }
    ],
    "version": "10.1.1"
}

在这里,ownerposts 是表。它们可以是空的数组/对象,但它们必须以这种方式存在。

注意: id:列是必须的,所有解析都使用它。

API

API 使用方法很简单。目前它不支持过滤器和其他查询参数。以下是您可以进行的调用列表,包括示例。

  • 获取列表 <host>:<port>/<table> GET
  • 获取记录 <host>:<port>/<table>/<id> GET
  • 插入记录 <host>:<port>/<table> POST
  • 更新记录 <host>:<port>/<table>/<id> PUT
  • 删除记录 <host>:<port>/<table>/<id> DELETE
  • 获取嵌套 <host>:<port>/<table>/<id><field>/<id>... GET

获取列表

url: http://127.0.0.1:8080/posts 
method: GET
body: empty

response: 
[
  {
    "author": "serayuzgur",
    "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
    "id": 1,
    "title": "Rust Rocks!"
  },
  {
    "author": "kamilbukum",
    "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
    "id": 2,
    "title": "TypeScript is Awesome"
  }
]

获取记录

url: http://127.0.0.1:8080/posts/1 
method: GET
body: empty

response: 
{
    "author": {
        "name": "seray",
        "surname": "uzgur"
    },
    "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
    "id": 1,
    "tags": [
        {
            "id": 1,
            "name": "tech"
        },
        {
            "id": 2,
            "name": "web"
        }
    ],
    "title": "Rust Rocks!"
}

插入记录

url: http://127.0.0.1:8080/posts
method: POST
body:
{
  "author": {
    "name": "hasan",
    "surname": "mumin"
  },
  "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
  "id": 3,
  "tags": [
    {
      "id": 1,
      "name": "tech"
    },
    {
      "id": 2,
      "name": "web"
    }
  ],
  "title": "KendoUI Rocks!"
}

response: 
{
  "author": {
    "name": "hasan",
    "surname": "mumin"
  },
  "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
  "id": 3,
  "tags": [
    {
      "id": 1,
      "name": "tech"
    },
    {
      "id": 2,
      "name": "web"
    }
  ],
  "title": "KendoUI Rocks!"
}

更新记录

url: http://127.0.0.1:8080/posts/3
method: PUT
body:
{
  "author": {
    "name": "hasan",
    "surname": "mumin"
  },
  "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
  "id": 3,
  "tags": [
    {
      "id": 1,
      "name": "tech"
    },
    {
      "id": 2,
      "name": "web"
    }
  ],
  "title": "KendoUI Rocks!"
}

response: 
{
  "author": {
    "name": "hasan",
    "surname": "mumin"
  },
  "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
  "id": 3,
  "tags": [
    {
      "id": 1,
      "name": "tech"
    },
    {
      "id": 2,
      "name": "web"
    }
  ],
  "title": "Angular Rocks!"
}

删除记录

url: http://127.0.0.1:8080/posts/3
method: DELETE
body: empty

response: 
{
  "author": {
    "name": "hasan",
    "surname": "mumin"
  },
  "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero.",
  "id": 3,
  "tags": [
    {
      "id": 1,
      "name": "tech"
    },
    {
      "id": 2,
      "name": "web"
    }
  ],
  "title": "KendoUI Rocks!"
}

获取嵌套

url: http://127.0.0.1:8080/posts/1/author
method: GET
body: empty

response:
{
    "name": "seray",
    "surname": "uzgur"
}
url: http://127.0.0.1:8080/posts/1/author/name
method: GET
body: empty

response:
"seray"
url: http://127.0.0.1:8080/posts/1/tags/1
method: GET
body: empty

response:
{
    "id": 1,
    "name": "tech"
}

查询API

字段选择

使API消费者能够选择返回字段。这还将减少网络流量并加快API的使用速度。

GET /cars?fields=manufacturer,model,id,color
分页
GET /cars?_offset=10&_limit=5
  • 添加 _offset 和 _limit(响应中包含 X-Total-Count 头)。

  • 要向用户发送总条目数,请使用自定义HTTP头:X-Total-Count。

  • 内容范围偏移 – 限制 / 计数。

    • offset:请求返回的第一个元素的索引。

    • limit:请求返回的最后一个元素的索引。

    • count:集合中元素的总数。

  • Accept-Range资源最大。

  • resource:分页的类型。必须指明正在使用的资源,例如:客户端、订单、餐厅、……

  • max:单个请求中可以返回的最大元素数。

排序
  • 允许对多个字段进行升序和降序排序。
  • 使用带有下划线的 sort 作为 _sort
  • 在代码中,降序描述为 -,升序描述为 +

GET /cars?_sort=-manufactorer,+model

运算符
  • 添加 _filter 查询参数,然后继续使用字段名、操作和值通过 , 分隔。
  • 模式 _filter=<fieldname><operation><value>
  • 支持的操作。
    • = 等于
    • != 不等于
    • < 小于
    • <= 小于等于
    • > 大于
    • >= 大于等于
    • ~= 类似于
    • |= 在(值必须用 | 分隔)

GEThttp://127.0.0.1:8080/robe/users?_filter=name=seray,active=true

  • 添加 _q

GET /cars?_q=nissan

许可

MIT许可(MIT)版权所有(c)2017 Seray Uzgur

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用该软件的权利,不受限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向提供软件的人提供软件,以便他们可以进行上述操作,但须遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和无侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是因合同、侵权或其他原因而产生的,无论是否与软件或软件的使用或其他方式有关。

依赖关系

~10–18MB
~238K SLoC