Estamos desarrollando un servidor con REST API, que acepta y responde con JSON. El problema es que si necesita cargar imágenes del cliente al servidor.
Nota: y también estoy hablando de un caso de uso en el que la entidad (usuario) puede tener múltiples archivos (carPhoto, licensePhoto) y también tener otras propiedades (nombre, correo electrónico ...), pero cuando crea un nuevo usuario, no No envíe estas imágenes, se agregan después del proceso de registro.
Conozco las soluciones, pero cada una de ellas tiene algunos defectos.
1. Use multipart / form-data en lugar de JSON
bueno : las solicitudes POST y PUT son tan RESTful como sea posible, pueden contener entradas de texto junto con el archivo.
contras : ya no es JSON, que es mucho más fácil de probar, depurar, etc., en comparación con multipart / form-data
2. Permitir actualizar archivos separados
La solicitud POST para crear un nuevo usuario no permite agregar imágenes (lo cual está bien en nuestro caso de uso, como dije al principio), la carga de imágenes se realiza mediante solicitud PUT como datos multiparte / formulario a, por ejemplo, / users / 4 / carPhoto
bueno : todo (excepto el archivo que se carga) permanece en JSON, es fácil de probar y depurar (puede registrar solicitudes JSON completas sin tener miedo de su longitud)
contras : No es intuitivo, no puede POST o PUT todas las variables de entidad a la vez y también esta dirección /users/4/carPhoto
puede considerarse más como una colección (el caso de uso estándar para REST API se ve así /users/4/shipments
). Por lo general, no puede (y no desea) OBTENER / PONER cada variable de entidad, por ejemplo usuarios / 4 / nombre. Puede obtener el nombre con GET y cambiarlo con PUT en users / 4. Si hay algo después de la identificación, generalmente es otra colección, como users / 4 / reviews
3. Use Base64
Envíalo como JSON pero codifica archivos con Base64.
bueno : igual que la primera solución, es un servicio lo más RESTful posible.
Contras : una vez más, las pruebas y la depuración son mucho peores (el cuerpo puede tener megabytes de datos), hay un aumento en el tamaño y también en el tiempo de procesamiento tanto en el cliente como en el servidor
Realmente me gustaría usar la solución no. 2, pero tiene sus contras ... ¿Alguien me puede dar una mejor idea de la solución "cuál es la mejor"?
Mi objetivo es tener servicios RESTful con tantos estándares incluidos como sea posible, mientras quiero que sea lo más simple posible.