2016-08-03 3 views
1

私のAPIが複数の同じ名前のパラメータをサポートするようにしようとしています。collectionFormat:マルチがPerlで動作しないMoogolicious Swagger2

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

私は私の闊歩ファイル(YAML)は、この定義(検証される)はPerlとCPANモジュールMojoliciousのとSwagger2

を使用しています:

/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'フィールドは配列のように見えますが、それはonlですyは最後の価値を持っています。

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

Swagger2バージョンです:

our $VERSION = '0.83'; 

私が間違って何をしているのですか?

答えて

1

私はあなたの事例を作っていると思います。あるいは、入力を乱すようなフックがあるかもしれません。以下のテストが正常に実行さ:

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

+0

あなたは正しいです!私はパラメータを操作している「フック」を発見しました。操縦してくれてありがとう! – GreensterRox

0

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); 
} 
関連する問題