Является ли использование multipart/form-data лучше, чем JSON + Base64?

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

Однако я обнаружил, что использование multipart/form-data не является идеальным. Объекты на моем сервере могут иметь другие объекты, вложенные в них и, таким образом, представлены как объект JSON с другими встроенными объектами JSON.

Я хотел бы, чтобы клиент начал создавать запросы POST/PUT с использованием представления JSON точно так же, как это ожидалось бы в запросе GET на сервере с помощью REST-ful. Таким образом, мне не нужно сглаживать поля, которые могут быть вложены в пару слоев внутри объекта JSON, чтобы использовать multipart/form-data.

Проблема в том, что JSON не представляет двоичные данные. У многостраничных/форма-данных, похоже, нет возможности представлять поля, вложенные в значения других полей. Но у него гораздо больше возможностей для загрузки файлов.

Я не понимаю, как это сделать. Должен ли я просто загрузить клиент JSON с полями, закодированными в base64, и взять 25% -ный удар? Или должен ли я иметь объект JSON, представляемый как некоторая "переменная json" в запросе Multipart/form-data, и иметь бинарные файлы для загрузки в качестве другой переменной?

Ответ 1

Должен ли я просто загрузить клиент JSON с полями, закодированными в base64, и взять 25% -ный удар?

Удар будет 33% с 4/3 = 1.33.

Или должен ли я иметь объект JSON, представляемый как некоторая "переменная json" в запросе Multipart/form-data, и иметь бинарные файлы для загрузки в качестве другой переменной?

Это должно сработать.

Вы также можете рассмотреть этот подход: отправить все файлы с помощью multipart, а затем получить некоторые идентификаторы файлов в качестве ответа. Поместите эти идентификаторы в свой json и отправьте его в любом случае. Этот подход может быть полезен, если у вас есть много сценариев, в которых вы отправляете файлы: вы всегда можете отправить их на сервер с тем же запросом, а затем получить их идентификаторы; после этого сделайте с ними то, что вам нравится.