Ми розробляємо сервер з REST API, який приймає та реагує на JSON. Проблема полягає в тому, якщо вам потрібно завантажити зображення з клієнта на сервер.
Примітка: а також я говорю про випадок використання, коли суб'єкт (користувач) може мати декілька файлів (carPhoto, licencePhoto), а також мати інші властивості (ім'я, електронна пошта ...), але коли ви створюєте нового користувача, ви не Не надсилаю ці зображення, вони додаються після реєстрації.
Мені відомі рішення, але кожне з них має деякі вади
1. Використовуйте дані з кількох частин / форм замість JSON
добре : POST та PUT запити максимально RESTful, вони можуть містити текстові введення разом із файлом.
Мінуси : Це вже не JSON, що набагато простіше тестувати, налагоджувати і т.д.
2. Дозволити оновлювати окремі файли
Запит POST для створення нового користувача не дозволяє додавати зображення (це нормально у нашому випадку використання, як я вже говорив на початку), завантаження зображень здійснюється за допомогою запиту PUT у вигляді багаточастинних / форм-даних, наприклад, для користувачів / 4 / carPhoto
добре : Все (крім самого завантаження файлу) залишається в JSON, його легко перевірити і налагодити (ви можете ввійти в систему повних запитів JSON, не боячись їх довжини)
Мінуси : це не інтуїтивно зрозуміло, ви не /users/4/carPhoto
можете надсилати POST або PUT всі змінні сутності одразу, а також ця адреса може розглядатися як збірка (стандартний випадок використання для API REST виглядає таким чином /users/4/shipments
). Зазвичай ви не можете (і не бажаєте) GET / PUT кожної змінної сутності, наприклад, users / 4 / name. Ви можете отримати ім'я за допомогою GET та змінити його на PUT у користувачів / 4. Якщо після ідентифікатора є щось, зазвичай це інша колекція, наприклад користувачі / 4 / огляди
3. Використовуйте Base64
Відправте його як JSON, але кодуйте файли за допомогою Base64.
добре : Те саме, що і перше рішення, це якнайшвидше обслуговування.
мінуси : Ще раз тестування та налагодження набагато гірше (тіло може мати мегабайти даних), збільшується розмір, а також час обробки обох - клієнта та сервера
Я дуже хотів би використовувати рішення «ні». 2, але це має свої мінуси ... Хто-небудь може мені краще зрозуміти рішення "що найкраще"?
Моя мета - забезпечити RESTful сервіси з якомога більшою кількістю стандартів, в той час як я хочу зробити це максимально просто.