Генератор OpenAPI typescript-axios multipart / form-data Как использовать сгенерированную функцию

У меня есть действующая спецификация OpenAPI для формы с multipart/form-data, содержащей файл и дополнительное текстовое поле. (сгенерировано из NestJS-Swagger, задокументировано здесь)

Он работает из пользовательского интерфейса Swagger, но я не могу понять, как получить код API, сгенерированный генератором OpenAPI для работы typescript-axios.

Вот OpenAPI YAML

"/users/files":
  post:
    operationId: UsersController_addPrivateFile
    summary: "..."
    parameters: []
    requestBody:
      required: true
      content:
        multipart/form-data:
          schema:
            "$ref": "#/components/schemas/UploadFileDto"

...

UploadFileDto:
  type: object
  properties:
    file:
      type: file
      properties:
        file:
          type: string
          format: binary
      description: "..."
      example: "'file': <any-kind-of-binary-file>"
    user_id:
      type: string
      description: "..."
      example: cus_IPqRS333voIGbS
  required:
  - file
  - user_id

вот как это выглядит при работе в Swagger UI

рабочие документы Swagger для данных многостраничной формы с дополнительным полем формы

Выход Axios, похоже, уважает API (я выделил не связанные части этих функций

public usersControllerAddPrivateFile(file: object, userId: string) {
    return UsersApiFp(this.configuration)
        .usersControllerAddPrivateFile(file, userId)
        .then((request) => request(this.axios, this.basePath));
}

async usersControllerAddPrivateFile(file, userId){
    const localVarAxiosArgs = await UsersApiAxiosParamCreator(
        configuration,
    ).usersControllerAddPrivateFile(file, userId);
    return (...) => {
        const axiosRequestArgs = {
            ...localVarAxiosArgs.options,
            ...
        };
        return axios.request(axiosRequestArgs);
    };
}

usersControllerAddPrivateFile(file, userId){
    ...
    const localVarFormParams = new FormData();
    localVarFormParams.append('file', file as any);
    localVarFormParams.append('user_id', userId as any);
    localVarHeaderParameter['Content-Type'] = 'multipart/form-data';
    ...
}

Я вызываю функцию вот так

onFileUpload = () => {
    const formData = new FormData();
    formData.append('file', this.state.selectedFile);
    const usersApi = new UsersApi();
    usersApi.usersControllerAddPrivateFile(formData,this.state.data.user_id,);
};

регистрация как на клиенте, так и на сервере показывает, что тело отсутствует ... несмотря на то, что файл и идентификатор пользователя присутствуют

введите описание изображения здесь

введите описание изображения здесь


person auerbachb    schedule 01.12.2020    source источник


Ответы (1)


Просмотр сгенерированного кода показывает, что функция просто ожидает необработанный файл и объединяет его в данные формы здесь:

usersControllerAddPrivateFile(file, userId){
    ...
    const localVarFormParams = new FormData();
    localVarFormParams.append('file', file as any);
    localVarFormParams.append('user_id', userId as any);
    localVarHeaderParameter['Content-Type'] = 'multipart/form-data';
    ...
}

таким образом просто обновляя вызов функции из

onFileUpload = () => {
    const formData = new FormData();
    formData.append('file', this.state.selectedFile);
    const usersApi = new UsersApi();
    usersApi.usersControllerAddPrivateFile(formData,this.state.data.user_id,);
};

to

const usersApi = new UsersApi();
usersApi.usersControllerAddPrivateFile(
    this.state.selectedFile,
    this.state.data.user_id,
);

решает проблему

person auerbachb    schedule 01.12.2020