简体   繁体   中英

Swagger POST Json Body Parameter Schema YAML

i'm working on a RESTful API using swagger-api and swagger-editor for routes. I can't figure out why the JSON i am sending through body, never reaches my controller. here is my YAML

  schemes:
  - http
  - https

produces: [application/json, multipart/form-data, application/x-www-form-urlencoded]

paths:
 /projects:
    x-swagger-router-controller: project
    post:
      description: create a new project
      operationId: postProjects
      consumes:
        - application/json
      parameters:
        - name: param1
          in: body
          description: description
          required: false
          schema:
            $ref: "#/definitions/Project" 
      responses:
        "200":
          description: Success
          schema:
            $ref: "#/definitions/Project" 
        default:
          description: Error
          schema: 
            $ref: "#/definitions/ErrorResponse"

definitions:
  Project:
    properties:
      name:
       type: string
    required:
      - name

an example of the post request i'm sending.

curl -v -X POST -H "Content-Type: application/json" -d '{"name":"test"}' http://127.0.0.1:10010/projects

and the response

{"message":"Request validation failed: Parameter (param1) failed schema validation","code":"SCHEMA_VALIDATION_FAILED","failedValidation":true,"results":{"errors":[{"code":"OBJECT_MISSING_REQUIRED_PROPERTY","message":"Missing required property: name","path":[]}],"warnings":[]},"path":["paths","/projects","post","parameters","0"],"paramName":"param1"}

If i set the parameter "name" as not required, i just received an empty response like this { param1: { path: [ 'paths', '/projects', 'post', 'parameters', '0' ], schema: { name: 'param1', in: 'body', description: 'description', required: false, schema: [Object] }, originalValue: {}, value: {} } } I have no clue why since other format such as header, path or formdata works fine. I always receive an empty object. req.swagger.params has no value. I tried several schema but even the simplest is not working. i can tell from the header that 'content-type': 'application/json'. So the content type is set, the schema validates a simple string argument named "name". Everything should be ok. but still not.

This issue has been fixed. It wasn't swagger related. I built an API with nodeJs and i realized i didn't have a middleware to handle body parameter. So because i missed a step before enabled the swagger middleware, i couldn't do anything with body parameter.

The main reason behind getting null values when sending json data to the API backend is the paramater path most of the time you give and the naming you give the parameter.

You also have to declare explicitly the type of schema you expect

You have to set parameter name to body and set in: body so that it picks the body object as a JSON

An example is here. You can try it out

/auth/register:
    post:
      tags:
        - Auth
      parameters:
        - in: body
          name: user
          description: Create a new user.
          schema:
            type: object
            required:
              - firstName
              - lastName
              - email
              - password
              - confirmPassword
            properties:
              firstName:
                type: string
              lastName:
                type: string
              email:
                type: string
              password:
                type: string
              confirmPassword:
                type: string
            example:
              firstName: Jane
              lastName: Doe
              email: janedoe@gmail.com
              password: pass
              confirmPassword: pass
      responses:
        "200":
          description: OK

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM