Perl Постоянная ошибка валидации "Свойства не разрешены: компоненты, openapi, серверы" - PullRequest
2 голосов
/ 01 апреля 2020

Я смотрю на создание API с использованием OpenAPI V3 в Perl с Mojolicious. И OpenAPI, и Mojolicious являются новыми для меня.

Mojolicious :: Plugin :: OpenAPI , похоже, находится в стадии активной разработки, а последняя версия 3.31 выходит менее чем за день до go на момент написания этой статьи.

У меня есть тестовая демонстрация, над которой я работаю и преодолел множество проблем, но я полностью застрял на этой ошибке, так как нет смысла говорить, что свойства в моем открытом API-интерфейсе c не допускается, несмотря на то, что находится в пределах openapi spe c.

** EDIT. Вот минимальный пример, который работает с использованием OpenAPI V2, но если я преобразовываю файл yaml в V3 spe c, возникает ошибка. Оба файла yaml проходят проверку на https://editor.swagger.io/

App2_0.pm

package App2_0;
use Mojo::Base "Mojolicious";

sub startup {
  my $self = shift;
  $self->plugin("OpenAPI" => {url => $self->home->rel_file("api.yaml")});
}
1;

Echo.pm

package App2_0::Controller::Echo;
use Mojo::Base "Mojolicious::Controller";  
sub index {
  # Render back the same data you received
  $self->render(openapi => $self->req->json);
}   
1;

basi c. t

use Mojo::Base -strict;

use Test::More;
use Test::Mojo;

my $t = Test::Mojo->new('App2_0');
$t->post_ok('/api/echo', '{"i":"work"}')->status_is(200)->json_is({i=>"work"});

done_testing();

api.yaml

swagger: '2.0'
info:
  version: '1.0'
  title: An API
basePath: "/api"
paths:
  "/echo":
    post:
      x-mojo-to: "echo#index"
      operationId: echo
      parameters:
      - in: body
        name: body
        schema:
          type: object
      responses:
        200:
          description: Echo response
          schema:
            type: object

api.yaml (то же, что и выше, но в V3)

openapi: 3.0.2
info:
  version: '1.0'
  title: An API
servers:
  - url: "/api"
paths:
  "/echo":
    post:
      x-mojo-to: "echo#index"
      operationId: echo
      requestBody:
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: ech response
          content:
            application/json:
              schema:
                type: object

Запуск теста с V2 yaml работает

prove -l t
t/basic.t .. ok
All tests successful.
Result: PASS

Тот же тест, но с использованием yaml V3 не удается

prove -l t
    Invalid JSON specification HASH(0x4415710):
- /: Properties not allowed: openapi, servers. at /usr/local/share/perl5/JSON/Validator.pm line 159.

...

t/basic.t .. Dubious, test returned 255 (wstat 65280, 0xff00)
No subtests run

Test Summary Report
-------------------
t/basic.t (Wstat: 65280 Tests: 0 Failed: 0)
  Non-zero exit status: 255
  Parse errors: No plan found in TAP output
Result: FAIL

** END EDIT, остальное - только мой пример OP, который теперь избыточен

Invalid JSON specification HASH(0x3801f58): - /: Properties not allowed: components, openapi, 
servers. at /usr/local/share/perl5/JSON/Validator.pm line 159.

This моя тестовая демонстрация openapi spe c

myapi_y2.yaml

openapi: 3.0.2
info:
  version: '1.0'
  title: An API
servers:
  - url: "/api"
paths:
  "/pets":
    get:
      operationId: get_pets
      x-mojo-name: get_pets
      x-mojo-to: pet#list
      summary: Finds pets in the system
      parameters:
        - in: query
          name: age
          schema:
            type: integer
      requestBody:
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Pet response
          content:
            application/json:
              schema:
                type: object
                properties:
                  pets:
                    type: array
                    items:
                      type: object                 
components:
  schemas:
    Pet:
      type: object
      required:
        - id
        - name
        - age
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        age:
          type: integer
          format: int64
    Pets:
      type: array
      items:
        $ref: "#/components/schemas/Pet"
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string                  

Я исчерпал Google и не могу найти информацию о том, почему это происходит. Кто-нибудь видел это или знает, почему это происходит?

Тестовый демонстрационный код my_app2

#!/usr/bin/env perl

use strict;
use warnings;

use FindBin;
BEGIN { unshift @INC, "$FindBin::Bin/../lib" }
use Mojolicious::Commands;

# Start command line interface for application
Mojolicious::Commands->start_app('MyApp2');

MyApp2.pm

package MyApp2;
use Mojo::Base "Mojolicious";

sub startup {
  my $app = shift;
  $app->plugin("OpenAPI" => {url => $app->home->rel_file("myapi_y2.yaml"), schema => 'v3'});
}

1;

Pet.pm

package MyApp2::Controller::Pet;
use Mojo::Base "Mojolicious::Controller";

sub list {

  my $c = shift->openapi->valid_input or return;

  my $age  = $c->param("age");
  my $body = $c->req->json;

  # $output will be validated by the OpenAPI spec before rendered
  my $output = {pets => [{name => "kit-e-cat"}]};
  $c->render(openapi => $output);
}

1;

Спасибо

...