Почтальон: «Неверный тип данных. Должно быть либо, массив, логическое значение, число» ошибка

#swagger #postman #openapi #postman-collection-runner #postman-pre-request-script

Вопрос:

Я получаю следующую ошибку при создании API в Postman: «Недопустимый тип данных. Должно быть либо массив, логическое значение, целое число, число, объект или строка»

Ошибка исправлена при преобразовании строки "type": "file" в "type": "object" , но я не уверен, есть ли правильный способ для этой ситуации. Потому что с этим обновлением запрос может не быть передан при отправке запроса в Postman.

 "parameters": [
  {
      "in": "body",
      "name": "file",
      "description": "file",
      "required": false,
      "schema": {
          "type": "array",
          "items": {
              "type": "file"
          }
      }
  },
  ...
]
 

Итак, как я могу устранить проблему в Postman?

Ответ №1:

Проблема не в Почтальоне, а в определении API. "type": "file" не является допустимым значением типа для использования в схемах и параметрах тела, этот тип можно использовать только в in: formData параметрах.

С другой стороны, я не добавляю файл, пытаясь протестировать свое приложение через Postman. По этой причине я просто хочу подавить ошибки

В этом случае вы можете изменить "type": "file" значение на "type": "string" для подавления ошибок импорта. Или удалите всю проблемную операцию из определения API.

Как правильно определить загрузку файлов в OpenAPI

Определение API пытается описать загрузку массива файлов, но это не поддерживается в OpenAPI 2.0 ( swagger: '2.0' ). OAS2 поддерживает только загрузку отдельных именованных файлов через multipart/form-data , и в этом случае определение API будет выглядеть следующим образом:

 {
  "swagger: "2.0",
  ...

  "paths": {
    "/something": {
      "post": {
        "consumes": [
          "multipart/form-data"
        ],
        "parameters": [
          {
            "in": "formData",
            "name": "file1",
            "type": "file"    // A single file sent via form field "file1"
          },
          {
            "in": "formData",
            "name": "file2",
            "type": "file"    // Another file sent via form field "file2"
          }
        ]
        ...
}
 

Однако загрузка массива файлов поддерживается в OpenAPI 3:

 {
  "openapi": "3.0.0",
  ...

  "paths": {
    "/something": {
      "post": {
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            }
          }
        },
        ...

      }
    }
  }
}
 

Комментарии:

1. Большое вам спасибо за эти прекрасные объяснения, проголосовали. В этой сцене я должен использовать object или text вместо file значения? Потому что я пытаюсь обновить "application/json" до "multipart/form-data" в consumes разделе, но проблема не устранена.

2. Вам нужно не только изменить consumes , но и заменить "in": "body" параметр одним или несколькими "in": "formData" параметрами, как в моем первом примере. Но это, вероятно, все равно не приведет к желаемому результату, потому что это не массив файлов, а N отдельных параметров файла. OpenAPI 2 просто вообще не поддерживает файловые массивы. Правильное решение-преобразовать ваш файл OpenAPI 2.0 в OpenAPI 3.0, исправить requestBody определение, как в моем 2-м примере, и вместо этого использовать исправленный файл OpenAPI 3.0 с Postman.

3. На самом деле у меня нет шансов использовать OpenAPI v3.0 , и я должен продолжать использовать OpenAPI v2.0 . С другой стороны, я не добавляю файл, пытаясь протестировать свое приложение через Postman. По этой причине я просто хочу подавить ошибки и задаться вопросом, какой способ наиболее правильный. Что бы вы предложили в этой сцене?

4. В этом случае вы можете изменить "type": "file" "type": "string" или полностью удалить проблемную операцию.