Я смотрю на создание 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;
Спасибо