Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Post a json body with swagger

I would like to POST a json body with Swagger, like this :

curl -H "Content-Type: application/json" -X POST -d {"username":"foobar","password":"xxxxxxxxxxxxxxxxx", "email": "[email protected]"}' http://localhost/user/register 

Currently, I have this definition :

"/auth/register": {         "post": {             "tags": [               "auth"             ],             "summary": "Create a new user account",             "parameters": [                 {                     "name": "username",                     "in": "query",                     "description": "The username of the user",                     "required": true,                     "type": "string"                 },                 {                     "name": "password",                     "in": "query",                     "description": "The password of the user",                     "required": true,                     "type": "string",                     "format": "password"                 },                 {                     "name": "email",                     "in": "query",                     "description": "The email of the user",                     "required": true,                     "type": "string",                     "format": "email"                 }             ],             "responses": {                 "201": {                     "description": "The user account has been created",                     "schema": {                         "$ref": "#/definitions/User"                     }                 },                 "default": {                     "description": "Unexpected error",                     "schema": {                         "$ref": "#/definitions/Errors"                     }                 }             }         }     }  

But the data are sent in the URL. Here the generated curl provided by Swagger :

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' 'http://localhost/user/register?username=foobar&password=password&email=foo%40bar.com' 

I understand that the query keywork is not good, but I didn't find the way to POST a JSON body. I tried formData but it didn't work.

like image 222
ncrocfer Avatar asked Feb 15 '16 14:02

ncrocfer


People also ask

How do I send a body in a POST request?

The format of an HTTP POST is to have the HTTP headers, followed by a blank line, followed by the request body. The POST variables are stored as key-value pairs in the body. You can see this using a tool like Fiddler, which you can use to watch the raw HTTP request and response payloads being sent across the wire.

CAN POST request contain body?

Yes it is expected to have Body/Content in body, but it is not required(Mandatory). Save this answer.


1 Answers

You need to use the body parameter:

    "parameters": [       {         "in": "body",         "name": "body",         "description": "Pet object that needs to be added to the store",         "required": false,         "schema": {           "$ref": "#/definitions/Pet"         }       }     ], 

and #/definitions/Pet is defined as a model:

"Pet": {   "required": [     "name",     "photoUrls"   ],   "properties": {     "id": {       "type": "integer",       "format": "int64"     },     "category": {       "$ref": "#/definitions/Category"     },     "name": {       "type": "string",       "example": "doggie"     },     "photoUrls": {       "type": "array",       "xml": {         "name": "photoUrl",         "wrapped": true       },       "items": {         "type": "string"       }     },     "tags": {       "type": "array",       "xml": {         "name": "tag",         "wrapped": true       },       "items": {         "$ref": "#/definitions/Tag"       }     },     "status": {       "type": "string",       "description": "pet status in the store",       "enum": [         "available",         "pending",         "sold"       ]     }   },   "xml": {     "name": "Pet"   } }, 

Ref: https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/test/resources/2_0/petstore.json#L35-L43

OpenAPI/Swagger v2 spec: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#parameter-object

For OpenAPI v3 spec, body parameter has been deprecated. To define the HTTP payload, one needs to use the requestBody instead, e.g. https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/test/resources/3_0/petstore.json#L39-L41

OpenAPI v3 spec: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#requestBodyObject

like image 56
William Cheng Avatar answered Oct 03 '22 14:10

William Cheng