rodrigoaramburu/php-json-server

用于创建前端原型测试的假REST API的库

v1.0.0 2022-08-25 12:02 UTC

This package is auto-updated.

Last update: 2024-09-29 06:14:53 UTC


README

PHP JSON Server是一个简单的库,可以在几分钟内提供REST API,用于测试前端,例如。

它可以通过PHP的内置服务器运行,或者非常容易地集成到框架中。它还提供了一个CLI来快速启动服务器并生成API数据。

*不应在生产环境中使用

灵感来自Zlob/php-json-server

安装

通过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.jsonindex.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]