rodrigoaramburu / php-json-server
用于创建前端原型测试的假REST API的库
Requires
- php: >8.0
- doctrine/inflector: ^2.0
- fakerphp/faker: ^1.20
- minicli/minicli: ^3.2
- nyholm/psr7: ^1.5
Requires (Dev)
- laravel/pint: ^1.1
- pestphp/pest: ^1.21
- pestphp/pest-plugin-mock: ^1.0
README
PHP JSON Server是一个简单的库,可以在几分钟内提供REST API,用于测试前端,例如。
它可以通过PHP的内置服务器运行,或者非常容易地集成到框架中。它还提供了一个CLI来快速启动服务器并生成API数据。
*不应在生产环境中使用
安装
通过composer composer require rodrigoaramburu/php-json-server
。
我们创建了一个名为index.php
的文件,包含以下代码。
$server = new Server([ 'database-file' => __DIR__.'/database.json', ]); $path = $_SERVER['REQUEST_URI']; $body = file_get_contents('php://input'); $headers = getallheaders(); $response = $server->handle($_SERVER['REQUEST_METHOD'], $path, $body, $headers); $server->send($response);
创建Server
时,我们传递了API数据的json路径。我们定义了初始数据和API将拥有的集合。请看以下database.json
示例
{
"embed-resources": {
"posts" : ["comments"]
},
"posts": [
{
"id": 1,
"title": "Lorem ipsum dolor sit amet",
"author": "Rodrigo",
"content": "Nunc volutpat ipsum eget sapien ornare..."
},
{
"id": 2,
"title": "Duis quis arcu mi",
"author": "Rodrigo",
"content": "Suspendisse auctor dolor risus, vel posuere libero..."
}
],
"comments": [
{
"id": 1,
"post_id": 1,
"comment": "Pellentesque id orci sodales, dignissim massa vel"
},
{
"id": 2,
"post_id": 2,
"comment": "Maecenas elit dui, venenatis ut erat vitae"
},
{
"id": 3,
"post_id": 1,
"comment": "Quisque velit tellus, tempus vitae condimentum nec"
}
]
}
JSON
中的每个属性代表一个集合,其值是该集合中包含的对象数组的数组。我们可以使用格式为<单数集合名>_id
的外键将一个集合中的对象与另一个集合中的对象连接起来,这将使在检索时将外键字段替换为指定的ID的资源。
为了加载一个资源以及所有必须具有外键的关联资源,我们向数据的embed-resources条目添加这个关系。
使用上面的JSON
,API将提供以下路由。
有了database.json
和index.php
,我们可以使用PHP的内置服务器运行API。
php -S localhost:8000 index.php
我们也可以轻松地将其集成到其他框架中。以下是一个使用Slim的示例。
use DI\Container; use JsonServer\Server; use Slim\Factory\AppFactory; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; $container = new Container(); AppFactory::setContainer($container); $app = AppFactory::create(); $server = new Server([ 'database-file' => __DIR__.'/database.json', ]); $app->any('/api/{path:.*}' , function(RequestInterface $request, ResponseInterface $response, $args) use($server){ $path = '/'.$args['path']; $body = (string) $request->getBody(); $headers = $request->getHeaders(); $response = $server->handle($request->getMethod(), $path, $body, $headers); return $response; }); $app->run();
- 注意:在这种情况下,API的路由将由
/api
前缀
由于handle
方法的返回值是Psr\Http\Message\ResponseInterface
接口的对象,因此只需将其返回给Slim以构建响应即可。
中间件
服务器允许使用middlewares,为此只需扩展抽象类JsonServer\Middlewares\Middleware
并实现方法public function process(RequestInterface $request, Handler $handler): ResponseInterface;
use JsonServer\Middlewares\Handler; use JsonServer\Middlewares\Middleware; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; class ExampleMiddleware extends Middleware { public function process(ServerRequestInterface $request, Handler $handler): ResponseInterface { //antes de ser processado $authToken = $request->getHeader("Authorization"); $response = $handler->handle($request); // após ser processado $response = $response->withHeader('Content-Type','application/json'); return $response; } }
然后将它添加到$server
$server->addMiddleware(new ExampleMiddleware());
静态路由中间件
我们可以使用中间件StaticMiddleware
创建静态路由,它在其构造函数中接收一个包含路由的array或json路径。
$staticRoutes = new StaticMiddleware([ "/static/route" => [ "GET" => [ "body" => "{\"message\": \"Uma resposta GET para o cliente \"}", "statusCode" => 200, "headers" => [ "Content-Type" => "application/json" ] ], "POST" => [ "body" => "{\"message\": \"Uma resposta POST para o cliente\"}", "statusCode" => 201, "headers" => [ "Content-Type" => "application/json" ] ], ] ]); $server->addMiddleware($staticRoutes);
我们也可以传递一个包含路由配置的json文件,例如static.json
。
{ "/static/route": { "GET": { "body": "{\"message\": \"Uma resposta GET para o cliente \"}", "statusCode": 200, "headers": { "Content-Type": "application/json" } }, "POST": { "body": "{\"message\": \"Uma resposta POST para o cliente\"}", "statusCode": 201, "headers": { "Content-Type": "application/json" } } } }
然后我们将其路径传递给中间件
$staticRoutes = new StaticMiddleware(__DIR__.'/static.json'); $server->addMiddleware($staticRoutes);
过滤和排序
我们可以通过传递字段和值作为query param来过滤资源
https://:8000/posts?author=rodrigo
我们可以通过传递由query param指定的字段来对结果进行排序,_sort参数用于字段名,_order参数用于方向(asc,desc);
localhost:8000/posts?_sort=author&_order=desc
CLI
启动服务器
还可以通过命令行界面以更简单的方式启动服务器,只需在文件夹中有JSON文件并运行即可
vendor/bin/json-server start
我们可以传递以下参数
生成database.json
我们可以使用以下命令生成数据文件
vendor/bin/json-server generate database resource1 resource2 ...
我们可以传递以下参数
生成资源数据
可以使用以下命令生成一个资源的数据
vendor/bin/json-server generate resources resource_name [filename=FILENAME] [fields=FIELDS_LIST]
我们可以传递以下参数
生成静态路由
可以使用以下命令为StaticMiddleware
中间件生成静态路由文件
vendor/bin/json-server generate database static [filename=FILENAME] [path=PATH] [method=METHOD] [body=BODY] [statusCode=STATUS_CODE] [headers=HEADER-LIST]