ybelenko/openapi-data-mocker-server-middleware

PSR-15 HTTP 服务器中间件,用于从 OpenAPI 规范(OAS 3.0)创建模拟响应。

1.2.0 2022-04-05 02:02 UTC

This package is auto-updated.

Last update: 2024-09-05 07:05:45 UTC


README

Build Status

PSR-15 HTTP 服务器中间件,用于从 OpenAPI 规范(OAS 3.0)创建模拟响应。此软件包是 OpenAPI Generator 项目的 PHP Slim4 服务器增强版本,但更容易在独立的存储库中维护。

要求

  • PHP ^7.3

重要通知!尽管在 composer.json 中声明了 PHP 8.0,但此软件包尚未针对它进行测试。

通过 Composer 安装

在终端运行

composer require ybelenko/openapi-data-mocker-server-middleware

构造函数参数

  1. $mocker: OpenApiDataMockerInterface
    • 是模拟类实例。要创建自定义数据模拟器,请扩展 OpenAPIServer\Mock\OpenApiDataMockerInterface
  2. $responses: array
  3. $responseFactory: ResponseFactoryInterface
  4. $getMockStatusCodeCallback: callable|null = null
    • 是在生成模拟数据之前调用的回调。以下示例显示了如何仅对具有 X-OpenAPIServer-Mock: ping HTTP 头的请求启用模拟功能。调整请求筛选以符合项目要求。此函数必须从 $responses 参数数组中返回单个响应模式。 当回调返回除了 $responses 数组中现有键之外的任何内容时,模拟功能将被禁用,例如 'default'200
  5. $afterCallback: callable|null = null
    • 是在生成模拟数据之后执行的回调。最明显的用例是为真实和模拟响应添加特定的 HTTP 头以区分它们。 此函数必须始终返回响应实例。

使用示例

require_once __DIR__ . '/vendor/autoload.php';

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Slim\Factory\AppFactory;
use Slim\Factory\ServerRequestCreatorFactory;
use OpenAPIServer\Mock\OpenApiDataMockerRouteMiddleware;
use OpenAPIServer\Mock\OpenApiDataMocker;

// initiate Slim app or any other PSR-15 compliant framework
$app = AppFactory::create();

// create new mocker instance
$mocker = new OpenApiDataMocker();

// responses OAS3.0 definition of GET /mock operation
// check examples/get_mock_responses.php file
$responsesForGetMockRoute = require_once(__DIR__ . '/get_mock_responses.php');

// initiate any PSR-17 compliant response factory
$responseFactory = AppFactory::determineResponseFactory();

// optional response schema selector
$getMockStatusCodeCallback = function (ServerRequestInterface $request, $responses) {
    // check if client clearly asks for mocked response
    if (
        $request->hasHeader('X-OpenAPIServer-Mock')
        && $request->getHeader('X-OpenAPIServer-Mock')[0] === 'ping'
    ) {
        $responses = (array) $responses;
        if (array_key_exists('default', $responses)) {
            return 'default';
        }

        // return first response key
        reset($responses);
        return key($responses);
    }
    return false;
};

// optional after middleware callback
$afterCallback = function (ServerRequestInterface $request, ResponseInterface $response) {
    // mark mocked response to distinguish real and fake responses
    return $response->withHeader('X-OpenAPIServer-Mock', 'pong');
};

// create middleware itself
$mw = new OpenApiDataMockerRouteMiddleware(
    $mocker,
    $responsesForGetMockRoute,
    $responseFactory,
    $getMockStatusCodeCallback,
    $afterCallback
);

// this package is route middleware, apply it to route as described in Slim docs:
// https://slim.php.ac.cn/docs/v4/concepts/middleware.html#route-middleware
$app->get('/mock', function (ServerRequestInterface $request, ResponseInterface $response) {
    $response->getBody()->write('Hello ');

    return $response;
})->add($mw);

$app->run();

// let's assume you started builtin PHP server
// which you MUST NOT use on production:
// $ php -S localhost:8888 examples/slim_example.php

// finally you can check output with curl library
// $ curl https://:8888/mock
// Hello

// $ curl https://:8888/mock -H 'X-OpenAPIServer-Mock: ping'