当前位置: 首页 > 知识库问答 >
问题:

POST参数未收到Swagger3.0/OpenAPI

吴开宇
2023-03-14

我正在使用Swagger 3.0/OpenAPI编写一个网站来描述我的API和Node。js用于后端。我成功地完成了GET请求,但我在处理所有POST请求时遇到了一些问题。问题是,我在执行POST请求时从HTML表单提供的参数似乎没有被/controllers文件夹中Swagger处理程序自动生成的参数接收。尤其是req.招摇。params数组和req.swagger。params['body']是HTTP请求对象的子字段,应该包含参数,但始终为空。

我尝试使用“应用程序/x-www-表单-乌伦编码”和“应用程序/json”作为内容类型;我尝试了不同的来源来执行请求,例如SwaggerUI、Postman、前端网页和CURL;我尝试了FetchAPI和JQuery AJAX($. post和$. ajax)。

这是我在注册.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']中找到参数。对于所有GET请求,值

共有2个答案

慎建本
2023-03-14

您可以继续使用 Swagger 的界面来创建您的 API,但不要从那里创建您的源代码。

将“swagger.yaml”文件保存到项目的文件夹中,例如“C:\myProject”,然后键入:

oas-generator swagger.yaml myproject

安装绿洲发电机:

npm install oas-generator -g

重要提示:仔细阅读文档:https://github.com/isa-group/oas-tools

更强大的OAS 2.x/3.x生成器:https://github.com/OpenAPITools/openapi-generator

澹台镜
2023-03-14

最后,我解决了从“oas3-tools”切换到“oas-tools”(https://github.com/isa-group/oas-tools)来管理OpenAPI 3.0 API的问题。有了这个新的节点模块,我能够在 req.body 中检索 POST 参数。

 类似资料:
  • 我在向控制器发出的web api rest post请求中始终收到一个空值 在我的控制器中 模型 请求: 我尝试了以下解决方案,但没有任何效果 https://myadventuresincoding.wordpress.com/2012/06/19/c-supporting-textplain-in-an-mvc-4-rc-web-api-application/ 如何在WebAPI中获取POS

  • 所以我有这个代码: 最初我有正常的,但我改成了这个,因为我认为这可能是一个标题问题。然而,我仍然没有检测到我的或。但是,它在中接收数据。 你知道怎么了吗? 编辑 好吧,我想我知道怎么了。它将其作为json对象发布,因此只能在php://输入中读取。如何将其更改为axios中的普通字符串?

  • 问题内容: 这是我的Java代码: 我这样称呼它: 问题是呼叫保持发布零零零,似乎我没有正确传递x和y。 更新资料 回答之后,我将请求更改为: 服务是: 但我仍然有同样的问题。这是服务器的响应: 您可以在末尾看到零:( 问题答案: (请注意,不是)是表单数据()向其发送了请求的正文,其中您的资源方法应更像 并且以下请求将起作用 注意: 在Windows中,必须使用双引号() 您甚至可以分离键值对

  • 我发送POST请求(OKHttp)从Android到Python服务器。 为什么标签为空,我在设置POST参数时丢失了一些点吗?

  • https://loginter.moveon.pro/?rest_route=/simple-jwt-login/v1/auth&email=email&password=密码 并得到如下所示的JSON: 我正在Android Studio上使用Volley库。 null null 在应用程序build.gradle build.gradle Volley依赖项中安装了Volley 在my ma

  • 问题内容: 我正在使用Jersey开发RESTful服务,并且与GET方法配合使用效果很好。但是我不能使其与POST方法和JSON或文本参数一起使用。这些是我所做的: 我只为所有参数获取空值。我试图只使用一个字符串作为参数,但是它也不起作用……我试图从IOS访问这些方法,也许这就是问题之一。但是我一直在嗅探我的局域网,并且可以在数据包主体中看到正确的参数……这正确吗? 我已经从XCode发送了如下