2016-08-03 36 views
1

Ich versuche, meine API mehrere Parameter mit dem gleichen Namen zu unterstützen: z.collectionFormat: Multi funktioniert nicht mit Perl Mojolicious Swagger2

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

Ich bin mit Perl und cpan Module Mojolicious und Swagger2

Meine Prahlerei-Datei (yaml) hat diese Definition (validiert):

/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 

Mein Controller sieht wie folgt aus:

Wenn Args in den Browser ausgegeben werden, erscheint das Feld "Myfield" als Array, aber nur als ein Array Du hast immer den letzten Wert drin.

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

Swagger2 Version ist:

our $VERSION = '0.83'; 

Was mache ich falsch?

Antwort

1

Ich denke, Sie machen Ihr Beispiel oder Sie haben einige Haken, die die Eingabe durcheinander bringen. Der Test unten läuft erfolgreich:

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"}} 
     } 
     } 
    } 
    } 
} 

Es gibt bereits ein Test dafür: https://github.com/jhthorsen/swagger2/blob/master/t/multi-param.t

+0

Sie haben Recht! Ich entdeckte einen "Haken", der die Parameter manipulierte. Danke für den Steuer! – GreensterRox

0

Sie können dieses Plugin statt ausprobieren möchten: https://metacpan.org/release/Mojolicious-Plugin-OpenAPI

Es ist spielt mehr zusammen mit den „Mojolicious Regeln“ Das heißt, Sie würden die Parameter folgendermaßen extrahieren:

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