fitbug / guzzle-swagger-validation-middleware

一个guzzle中间件,用于验证请求和响应是否符合schema中定义的内容

v0.1.0 2016-10-15 13:42 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:31:22 UTC


README

Scrutinizer Code Quality Build Status StyleCI Status Latest Stable Version Coverage Status

一个guzzle中间件,用于验证请求和响应是否符合schema中定义的内容

入门

先决条件

您需要安装

  • PHP (最低版本 5.6)

安装

composer require fitbug/guzzle-swagger-validation-middleware

使用

只需将其添加到您使用的guzzle中间件中。

use Fitbug\Guzzle\SwaggerValidation\SwaggerSchemaValidationHandler;
use GuzzleHttp\HandlerStack;
use Http\Adapter\Guzzle6\Client as GuzzleClientFactory;
use Http\Message\MessageFactory\GuzzleMessageFactory;

$this->messageFactory = new GuzzleMessageFactory();
$swaggerFile = 'file://';
$swaggerFile .= '/path/to/your/swagger.json';
$this->swaggerValidation = new SwaggerSchemaValidationHandler($swaggerFile);
$stack = new HandlerStack();
$stack->setHandler(GuzzleHttp\choose_handler());
$stack->push($this->swaggerValidation);
$this->httpClient = GuzzleClientFactory::createWithConfig(
    [
        'base_uri' => $apiEndpoint,
        'handler' => $stack,
    ]
);

您会得到输出,表明请求或响应不符合规范

 PHPUnit_Framework_ExpectationFailedException: Failed asserting that 'application/json, application/json' is an allowed media type (application/json). in vendor/phpunit/phpunit/src/Framework/Constraint.php:115
      Stack trace:
      #0 vendor/phpunit/phpunit/src/Framework/Constraint.php(58): PHPUnit_Framework_Constraint->fail('application/jso...', '')
      #1 vendor/phpunit/phpunit/src/Framework/Assert.php(1980): PHPUnit_Framework_Constraint->evaluate('application/jso...', '')
      #2 vendor/fr3d/swagger-assertions/src/PhpUnit/AssertsTrait.php(128): PHPUnit_Framework_Assert::assertThat('application/jso...', Object(FR3D\SwaggerAssertions\PhpUnit\MediaTypeConstraint), '')
      #3 vendor/fr3d/swagger-assertions/src/PhpUnit/Psr7AssertsTrait.php(89): Fitbug\BackOfficeApi\Features\Support\Guzzle\SwaggerSchemaValidationHandler->assertRequestMediaTypeMatch('application/jso...', Object(FR3D\SwaggerAssertions\SchemaManager), '/v0/company', 'POST', '')
...snip...
      #45 vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php(256): Behat\Testwork\Cli\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #46 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #47 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php(186): Symfony\Component\Console\Application->doRunCommand(Object(Behat\Testwork\Cli\Command), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #48 vendor/behat/behat/src/Behat/Testwork/Cli/Application.php(121): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #49 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php(117): Behat\Testwork\Cli\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #50 vendor/behat/behat/bin/behat(32): Symfony\Component\Console\Application->run()
      #51 {main}
      
      Next Exception: Failed asserting that 'application/json, application/json' is an allowed media type (application/json).
      
      POST /v0/company HTTP/1.1
      User-Agent: GuzzleHttp/6.2.1 curl/7.35.0 PHP/7.0.7
      Host: localhost
      Accept: application/json
      Accept: application/json
      Content-Type: application/json
      Content-Type: application/json
      Authorization: FITBUG-INTERNAL client-id=behat
      
      {"name":"starhealth","description":"some description","contact_email":"some support information"}
      
      
      HTTP/1.1 500 Internal Server Error
      Date: Thu, 08 Sep 2016 10:47:15 GMT
      Server: Apache/2.4.10 (Debian)
      Vary: Authorization
      X-Powered-By: PHP/7.0.10
      Set-Cookie: PHPSESSID=93257eb031eb0a7b84e4a2af7fef1495; path=/; HttpOnly
      Cache-Control: no-cache
      Content-Length: 195
      Connection: close
      Content-Type: application/json
      
      {
          "meta": {
              "error": {
                  "number": 2004,
                  "message": "Unknown error",
                  "user_message": "An unknown error has occured"
              }
          },
          "data": {}
      }
       in features/support/Guzzle/SwaggerSchemaValidationHandler.php:99
      Stack trace:
      #0 vendor/guzzlehttp/promises/src/Promise.php(203): Fitbug\BackOfficeApi\Features\Support\Guzzle\SwaggerSchemaValidationHandler->Fitbug\BackOfficeApi\Features\Support\Guzzle\{closure}(Object(GuzzleHttp\Psr7\Response))
      #1 vendor/guzzlehttp/promises/src/Promise.php(169): GuzzleHttp\Promise\Promise::callHandler(1, Object(GuzzleHttp\Psr7\Response), Array)
      #2 vendor/guzzlehttp/promises/src/FulfilledPromise.php(39): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}(Object(GuzzleHttp\Psr7\Response))
      #3 vendor/guzzlehttp/promises/src/TaskQueue.php(61): GuzzleHttp\Promise\FulfilledPromise::GuzzleHttp\Promise\{closure}()
...snip...
      #41 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php(186): Symfony\Component\Console\Application->doRunCommand(Object(Behat\Testwork\Cli\Command), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #42 vendor/behat/behat/src/Behat/Testwork/Cli/Application.php(121): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #43 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php(117): Behat\Testwork\Cli\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #44 vendor/behat/behat/bin/behat(32): Symfony\Component\Console\Application->run()
      #45 {main}
      
      Next RuntimeException: Invalid exception returned from Guzzle6 in vendor/php-http/guzzle6-adapter/src/Promise.php:65
      Stack trace:
      #0 vendor/guzzlehttp/promises/src/Promise.php(203): Http\Adapter\Guzzle6\Promise->Http\Adapter\Guzzle6\{closure}(Object(Exception))
      #1 vendor/guzzlehttp/promises/src/Promise.php(156): GuzzleHttp\Promise\Promise::callHandler(2, Object(Exception), Array)
      #2 vendor/guzzlehttp/promises/src/TaskQueue.php(61): GuzzleHttp\Promise\Promise::GuzzleHttp\Promise\{closure}()
      #3 vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php(96): GuzzleHttp\Promise\TaskQueue->run()
...snip...
      #41 vendor/behat/behat/src/Behat/Testwork/Cli/Application.php(121): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #42 vendor/symfony/symfony/src/Symfony/Component/Console/Application.php(117): Behat\Testwork\Cli\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      #43 vendor/behat/behat/bin/behat(32): Symfony\Component\Console\Application->run()
      #44 {main}

运行测试

首先检出库,然后运行

composer install

编码风格

我们遵循PSR2,并对所有函数强制执行PHPDocs。要运行测试以检查编码风格违规,

vendor/bin/php-cs-fixer fix -v

单元测试

我们使用PHPSpec进行单元测试。要运行单元测试

vendor/bin/phpspec run

贡献

请阅读CONTRIBUTING.md以获取关于我们行为准则和向我们的提交拉取请求的流程的详细信息。

版本控制

我们使用SemVer进行版本控制。有关可用版本,请参阅此存储库上的标签

作者

查看参与此项目的贡献者列表

许可证

本项目采用MIT许可证 - 有关详细信息,请参阅LICENSE.md文件。