我应该如何处理 Swagger 中的 application/javascript 响应类型?

How should I handle an application/javascript response type in Swagger?

我有一个 swagger 应用程序可以在返回 JSON 时运行,但不能与 JSONP 一起运行。成功和失败的案例在下面进一步描述。

值得注意的是,下面显示的确切控制器代码在 vanilla node/express 下工作正常 - 当响应通过 swagger 响应验证器时似乎会出现问题。

处理响应的控制器代码片段如下:

retVal.success = true;
retVal.data = jsondata;
res.set('Content-Type', 'application/javascript');
res.jsonp(200, retVal);

swagger.yaml:

swagger: "2.0"
info:
  title: sometitle
  version: v1
host: localhost:3000
basePath: /
schemes:
  - http
consumes:
- application/json
- application/javascript
produces:
- application/json
- application/javascript
- text/javascript
paths:
  /loadallrepos:
    x-swagger-router-controller: loadallrepos
    get:
      summary: summary here...
      description: |
        description here...
      operationId: loadallrepos
      parameters:
        - name: callback
          in: query
          description: Passed by .ajax call for cross-domain requests
          required: false
          type: string
      responses:
        200:
          description: Success
          schema:
            $ref: "#/definitions/loadallreposResponse"
definitions:
  loadallreposResponse:
    type: object
    required:
      - success
      - data
    properties:
      success:
        type: boolean
      data:
        type: object
        required:
          - nextrefresh
        properties:
          nextrefresh:
            type: integer

如果我在没有回调参数的情况下发出请求,它会起作用:

请求:localhost:3000/loadallrepos

回复:

{
      "success": true,
      "data": {
        "nextrefresh": 3439704
      }
}

如果我把它变成一个 jsonp 请求,它会失败:

请求:localhost:3000/loadallrepos?callback=jQuery111106460774131119251_1439402109118&_1439402109119

回复:

{
    "message": "Response validation failed: value expected to be an array/object but is not",
    "failedValidation": true,
    "originalResponse": "typeof jQuery111106460774131119251_1439402109118 === 'function' && jQuery111106460774131119251_1439402109118({
  "success": true,
  "data": {
    "nextrefresh": 3442750
  }
});"
}

同样,这在原版 node/express 下有效。非常感谢任何帮助!

JSONP APIs return一串JavaScript。您的 Swagger 定义说您的 API return 是一个定义在 #/definitions/loadallreposResponse 的对象,属于 type object。发生的事情是 swagger-node/swagger-tools 看到 objecttype 并尝试在响应主体上使用 JSON.parse 但失败了。要使用 Swagger 支持 JSONP,您需要将响应模式设为 type string 以避免响应验证失败。