POST 未收到 Swagger3.0/OpenAPI 参数
POST parameters not received Swagger3.0/OpenAPI
我正在使用 Swagger 3.0/OpenAPI 编写一个网站来描述我的 API,Node.js 用于后端。
我成功地使 GET 请求工作,但我在处理所有 POST 请求时遇到了一些问题。
问题是我在执行 POST 请求时从 HTML 表单提供的参数似乎没有被 /controllers 文件夹中的 Swagger 处理程序自动生成。特别是,HTTP 请求对象的 req.swagger.params 数组和 req.swagger.params['body'] 子字段(应该包含参数)始终为空。
我尝试同时使用 'application/x-www-form-urlencoded' 和 'application/json' 作为 ContentType;我尝试了不同的源来执行请求,例如SwaggerUI、Postman、前端网页和CURL;我尝试了 FetchAPI 和 JQuery AJAX ($.post 和 $.ajax).
这是我在 Register.js 中执行 POST 请求的方式:
event.preventDefault();
var firstname = $('#inputFirstname').val();
var lastname = $('#inputLastname').val();
var email = $('#inputEmail').val();
var psw = $('#inputPassword').val();
var data = {
'firstname': firstname,
'lastname': lastname,
'email': email,
'password': psw
};
$.ajax({
url: '/user/register',
type: 'POST',
dataType: 'text', // also tried json
contentType: 'application/x-www-form-urlencoded', //also tried json
data: data
}
)
.done(successScreen)
.fail(() => console.log('Fail'));
这是我在 swagger.yaml 中描述我的 API 的方式:
(...)
/user/register:
post:
tags:
- user
summary: Create a new user.
description: Register into the store.
operationId: userRegisterPOST
requestBody:
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/RegisterBody'
responses:
201:
description: succesfull registration
content: {}
x-swagger-router-controller: User
(...)
RegisterBody:
required:
- email
- firstname
- lastname
- password
type: object
properties:
email:
type: string
password:
type: string
firstname:
type: string
lastname:
type: string
这是 /controllers/User.js 中为 /user/register 上的 POST 请求自动生成的处理程序:
49:module.exports.userRegisterPOST = function userRegisterPOST (req, res){
50: var body = req.swagger.params['body'].value; // here it's where I get the error, but it's auto-generated code
51: User.userRegisterPOST(body)
52: .then(function (response) {
53: utils.writeJson(res, response);
54: })
55: .catch(function (response) {
56: utils.writeJson(res, response);
57: });
58:};
我得到的错误是:
TypeError: Cannot read property 'value' of undefined
at userRegisterPOST (/.../controllers/User.js:50:41)
at swaggerRouter (/.../node_modules/oas3-tools/middleware/swagger-router.js:388:20)
at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/.../node_modules/express/lib/router/index.js:317:13)
at /.../node_modules/express/lib/router/index.js:284:7
at Function.process_params (/.../node_modules/express/lib/router/index.js:335:12)
at next (/.../node_modules/express/lib/router/index.js:275:10)
at /.../node_modules/oas3-tools/middleware/swagger-validator.js:388:30
at /.../node_modules/async/dist/async.js:1140:9
at /.../node_modules/async/dist/async.js:473:16
at eachOfArrayLike (/.../node_modules/async/dist/async.js:1057:9)
at eachOf (/.../node_modules/async/dist/async.js:1117:5)
at _asyncMap (/.../node_modules/async/dist/async.js:1133:5)
at Object.map (/.../node_modules/async/dist/async.js:1122:16)
at swaggerValidator (/.../node_modules/oas3-tools/middleware/swagger-validator.js:358:15)
at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)
我应该在 req.swagger.params['body'].value
中找到所有 GET 请求的参数。
最后,我解决了从 'oas3-tools' 切换到“oas-tools”(https://github.com/isa-group/oas-tools)以管理 OpenAPI 3.0 API 的问题。
使用这个新的 Node 模块,我能够在 req.body 中检索 POST 参数。
您可以继续使用 Swagger 的界面来创建您的 API,但不要从那里创建您的源代码。
将 "swagger.yaml" 文件保存到项目的文件夹中,例如 "C:\myproject",然后键入:
oas-generator swagger.yaml myproject
oas-generator 安装:
npm install oas-generator -g
重要:仔细阅读文档:https://github.com/isa-group/oas-tools
更强大的 OAS 2.x/3.x 生成器:https://github.com/OpenAPITools/openapi-generator
我正在使用 Swagger 3.0/OpenAPI 编写一个网站来描述我的 API,Node.js 用于后端。 我成功地使 GET 请求工作,但我在处理所有 POST 请求时遇到了一些问题。 问题是我在执行 POST 请求时从 HTML 表单提供的参数似乎没有被 /controllers 文件夹中的 Swagger 处理程序自动生成。特别是,HTTP 请求对象的 req.swagger.params 数组和 req.swagger.params['body'] 子字段(应该包含参数)始终为空。
我尝试同时使用 'application/x-www-form-urlencoded' 和 'application/json' 作为 ContentType;我尝试了不同的源来执行请求,例如SwaggerUI、Postman、前端网页和CURL;我尝试了 FetchAPI 和 JQuery AJAX ($.post 和 $.ajax).
这是我在 Register.js 中执行 POST 请求的方式:
event.preventDefault();
var firstname = $('#inputFirstname').val();
var lastname = $('#inputLastname').val();
var email = $('#inputEmail').val();
var psw = $('#inputPassword').val();
var data = {
'firstname': firstname,
'lastname': lastname,
'email': email,
'password': psw
};
$.ajax({
url: '/user/register',
type: 'POST',
dataType: 'text', // also tried json
contentType: 'application/x-www-form-urlencoded', //also tried json
data: data
}
)
.done(successScreen)
.fail(() => console.log('Fail'));
这是我在 swagger.yaml 中描述我的 API 的方式:
(...)
/user/register:
post:
tags:
- user
summary: Create a new user.
description: Register into the store.
operationId: userRegisterPOST
requestBody:
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/RegisterBody'
responses:
201:
description: succesfull registration
content: {}
x-swagger-router-controller: User
(...)
RegisterBody:
required:
- email
- firstname
- lastname
- password
type: object
properties:
email:
type: string
password:
type: string
firstname:
type: string
lastname:
type: string
这是 /controllers/User.js 中为 /user/register 上的 POST 请求自动生成的处理程序:
49:module.exports.userRegisterPOST = function userRegisterPOST (req, res){
50: var body = req.swagger.params['body'].value; // here it's where I get the error, but it's auto-generated code
51: User.userRegisterPOST(body)
52: .then(function (response) {
53: utils.writeJson(res, response);
54: })
55: .catch(function (response) {
56: utils.writeJson(res, response);
57: });
58:};
我得到的错误是:
TypeError: Cannot read property 'value' of undefined
at userRegisterPOST (/.../controllers/User.js:50:41)
at swaggerRouter (/.../node_modules/oas3-tools/middleware/swagger-router.js:388:20)
at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/.../node_modules/express/lib/router/index.js:317:13)
at /.../node_modules/express/lib/router/index.js:284:7
at Function.process_params (/.../node_modules/express/lib/router/index.js:335:12)
at next (/.../node_modules/express/lib/router/index.js:275:10)
at /.../node_modules/oas3-tools/middleware/swagger-validator.js:388:30
at /.../node_modules/async/dist/async.js:1140:9
at /.../node_modules/async/dist/async.js:473:16
at eachOfArrayLike (/.../node_modules/async/dist/async.js:1057:9)
at eachOf (/.../node_modules/async/dist/async.js:1117:5)
at _asyncMap (/.../node_modules/async/dist/async.js:1133:5)
at Object.map (/.../node_modules/async/dist/async.js:1122:16)
at swaggerValidator (/.../node_modules/oas3-tools/middleware/swagger-validator.js:358:15)
at Layer.handle [as handle_request] (/.../node_modules/express/lib/router/layer.js:95:5)
我应该在 req.swagger.params['body'].value
中找到所有 GET 请求的参数。
最后,我解决了从 'oas3-tools' 切换到“oas-tools”(https://github.com/isa-group/oas-tools)以管理 OpenAPI 3.0 API 的问题。 使用这个新的 Node 模块,我能够在 req.body 中检索 POST 参数。
您可以继续使用 Swagger 的界面来创建您的 API,但不要从那里创建您的源代码。
将 "swagger.yaml" 文件保存到项目的文件夹中,例如 "C:\myproject",然后键入:
oas-generator swagger.yaml myproject
oas-generator 安装:
npm install oas-generator -g
重要:仔细阅读文档:https://github.com/isa-group/oas-tools
更强大的 OAS 2.x/3.x 生成器:https://github.com/OpenAPITools/openapi-generator