【问题标题】:collectionFormat: multi not working with Perl Mojolicious Swagger2collectionFormat:multi 不适用于 Perl Mojolicious Swagger2
【发布时间】:2016-12-09 00:06:08
【问题描述】:

我正在尝试让我的 API 支持多个同名参数:例如

/myAPI/search?myfield=1&myfield=2&myfield=3

我正在使用 Perl 和 cpan 模块 Mojolicious 和 Swagger2

我的 swagger 文件 (yaml) 有这个定义(已验证):

/search:
    get:
      x-mojo-controller: "Search"
      operationId: search
      description: Search
      parameters:
        - name: myfield
          description: Array of types
          in: query
          type: array
          collectionFormat: multi
          uniqueItems: true
          items:
            type: string
          required: false

我的控制器如下所示:

package myAPI::Controller::Search;
use Mojo::Base 'Mojolicious::Controller';
sub search {
    my( $self, $args, $cb ) = @_;
    $self->render(text => Dumper $args);
}

当 args 被转储到浏览器时,“myfield”字段似乎是一个数组,但它只有最后一个值。

$VAR1 = { 'myfield' => [ '3' ] };

Swagger2 版本是:

our $VERSION = '0.83';

我做错了什么?

【问题讨论】:

    标签: perl yaml swagger mojolicious


    【解决方案1】:

    您可能想试试这个插件:https://metacpan.org/release/Mojolicious-Plugin-OpenAPI

    它与“mojolicious 规则”一起播放更多,这意味着您可以像这样提取参数:

    sub search {
      my $c = shift->openapi->valid_input or return; 
      my $values = $c->every_param("myfield");
      $c->reply->openapi(200 => $values);
    }
    

    【讨论】:

      【解决方案2】:

      我认为您正在制作示例,否则您可能有一些钩子会弄乱输入。下面的测试运行成功:

      use Mojo::Base -strict;
      use Test::Mojo;
      use Test::More;
      
      package MyApp::Example;
      use Mojo::Base 'Mojolicious::Controller';
      
      sub search {
        my ($self, $args, $cb) = @_;
        $self->$cb($args, 200);
      }
      
      package main;
      use Mojolicious::Lite;
      plugin Swagger2 => {url => 'data://main/multi-param.json'};
      
      my $t = Test::Mojo->new;
      $t->get_ok('/search?myfield=1&myfield=2&myfield=3')->status_is(200)->json_is('/myfield', [1, 2, 3]);
      
      done_testing;
      
      __DATA__
      @@ multi-param.json
      {
        "swagger": "2.0",
        "info": {"version": "1.0", "title": "Test multi"},
        "paths": {
          "/search": {
            "get": {
              "x-mojo-controller": "MyApp::Example",
              "operationId": "search",
              "parameters": [
                {
                  "name": "myfield",
                  "in": "query",
                  "type": "array",
                  "collectionFormat": "multi",
                  "uniqueItems": true,
                  "items": { "type": "string" },
                  "required": false
                }
              ],
              "responses": {
                "200": {"description": "whatever", "schema": {"type": "object"}}
              }
            }
          }
        }
      }
      

      已经对此进行了测试:https://github.com/jhthorsen/swagger2/blob/master/t/multi-param.t

      【讨论】:

      • 你是对的!我发现了一个操纵参数的“钩子”。感谢您的指导!
      猜你喜欢
      • 2015-07-25
      • 1970-01-01
      • 2017-08-25
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多