APISchema

 view release on metacpan or  search on metacpan

eg/bmi.psgi  view on Meta::CPAN


    my $match = $router->match($env);

    return [404, [], ['not found']] unless $match;

    my $req = Plack::Request->new($env);

    my $payload = decode_json($req->content);

    my $bmi = $payload->{weight} / ($payload->{height} * $payload->{height});

    return [200, ['Content-Type' => 'application/json'], [encode_json({value => $bmi})]];
};

builder {
    enable "APISchema::ResponseValidator", schema => $schema;
    enable "APISchema::RequestValidator",  schema => $schema;
    mount '/doc/' => Plack::App::APISchema::Document->new(
        schema => $schema,
    )->to_app;
    mount '/mock/' => builder {
        enable "APISchema::ResponseValidator", schema => $schema;
        enable "APISchema::RequestValidator",  schema => $schema;

        Plack::App::APISchema::MockServer->new(
            schema => $schema,
        )->to_app;
    };
    mount '/doc.md' => sub {
        my $generator = APISchema::Generator::Markdown->new;
        my $content = $generator->format_schema($schema);
        [200, ['Content-Type' => 'text/plain; charset=utf-8;'], [$content]];
    };

    mount '/' => $app;
}

__END__

=encoding utf-8

=head1 NAME

BMI Calculator

=head1 NAME

Sample Application

=head1 HOW TO USE

Start the appliction.

    carton exec -- plackup bmi.psgi

Then,

    % curl -X POST -H "Content-type: application/json" -d '{"weight": 60, "height": '1.7'}' http://localhost:5000/bmi
    {"value":20.7612456747405}

Requests and Reponses to the API are validated by Middlewares.

    % curl -X POST -H "Content-type: application/json" -d 'hello' http://localhost:5000/bmi
    {"attribute":"Valiemon::Attributes::Required","position":"/required"}

    % curl -X POST -H "Content-type: application/json" -d '{"weight": 60, "height": 'a'}' http://localhost:5000/bmi
    {"attribute":"Valiemon::Attributes::Required","position":"/required"}

    % curl -X POST -H "Content-type: application/json" -d '{"weight": 60, "height": 'a'}' http://localhost:5000/bmi
    {"attribute":"Valiemon::Attributes::Required","position":"/required"}

    % curl -X POST -H "Content-type: application/json" -d '{"weight": 60}' http://localhost:5000/bmi
    {"attribute":"Valiemon::Attributes::Required","position":"/required"}

You can read the document of API at L<http://localhost:5000/doc/>



( run in 0.715 second using v1.01-cache-2.11-cpan-39bf76dae61 )