Skip to content

serializeBodyData

serializeBodyData — это функция, отвечающая за преобразование (сериализацию) данных, которые передаются в тело запроса (body) методов post, put, patch, delete класса HttpClient.

Для чего нужна

  • Позволяет автоматически преобразовывать любые данные (объекты, строки, FormData и др.) в формат, который корректно воспринимается fetch в поле body.
  • Обеспечивает универсальность и удобство работы с разными типами данных без необходимости вручную сериализовать их в каждом запросе.
  • Даёт возможность гибко переопределять логику сериализации для специфических кейсов (например, отправка файлов, нестандартные форматы, интеграция с legacy API).

Реализация по умолчанию

В библиотеке реализована функция defaultSerializeBodyData, которая используется по умолчанию:

ts
export function defaultSerializeBodyData<Input = unknown>(
  data: Input
): BodyInit | null | undefined {
  if (data === undefined) return;
  if (data == null) return null;

  // Если это FormData, Blob, ArrayBuffer, URLSearchParams — возвращаем как есть
  if (
    (typeof FormData !== "undefined" && data instanceof FormData) ||
    (typeof Blob !== "undefined" && data instanceof Blob) ||
    (typeof ArrayBuffer !== "undefined" && data instanceof ArrayBuffer) ||
    (typeof URLSearchParams !== "undefined" && data instanceof URLSearchParams)
  ) {
    return data as BodyInit;
  }

  // Если это строка — возвращаем как есть
  if (typeof data === "string") return data;

  // Если это объект или массив — сериализуем в JSON
  if (typeof data === "object" || Array.isArray(data)) {
    return JSON.stringify(data);
  }

  // Для других типов (например, число, boolean) — преобразуем в строку
  return String(data);
}

Как работает в HttpClient

  • По умолчанию используется глобально для всех методов, если не указано иное.
  • Можно переопределить глобально при создании клиента:
    ts
    const client = new HttpClient({
      serializeBodyData: (body) => {
        if (body instanceof FormData) return body;
        return JSON.stringify(body);
      },
    });
  • Можно переопределить для конкретного запроса через config:
    ts
    await client.post("/upload", formData, {
      serializeBodyData: (data) => data, // отправляем FormData как есть только для этого запроса
    });

Рекомендации

  • В большинстве случаев достаточно стандартной реализации — она покрывает все типовые сценарии (JSON, FormData, файлы, строки).
  • Переопределяйте serializeBodyData, если:
    • Требуется особый формат сериализации (например, XML, Protobuf, кастомные бинарные данные).
    • Необходимо реализовать специфическую логику для интеграции с нестандартными API.
  • Для единичных случаев используйте локальное переопределение через config, для глобальных — через конструктор клиента.

Подробнее о настройке и примерах использования см. разделы: