El hecho de que usted no está envolviendo todo el cuerpo de la petición en JSON, no quería decir que no es REST utilizar multipart/form-data
para publicar tanto el JSON y el archivo (o varios archivos) en una sola petición:
curl -F "metadata=<metadata.json" -F "[email protected]" http://example.com/add-file
en el lado del servidor (usando Python como la lengua franca de programación aquí):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
para cargar mu ltiple archivos, es posible utilizar cualquiera de los dos "campos de formulario" separados para cada uno:
curl -F "metadata=<metadata.json" -F "[email protected]" -F "[email protected]" http://example.com/add-file
... en cuyo caso el código del servidor tendrá request.args['file1'][0]
y request.args['file2'][0]
o volver a usar el mismo para muchos :
curl -F "metadata=<metadata.json" -F "[email protected]" -F "[email protected]" http://example.com/add-file
... en cuyo caso request.args['files']
será simplemente una lista de longitud 2.
o efectivamente transcurridos varios archivos en un solo campo de una sola vez:
curl -F "metadata=<metadata.json" -F "[email protected],some-other-file.tar.gz" http://example.com/add-file
... en cuyo caso request.args['files']
habrá una cadena que contiene todos los archivos, que usted tendrá que analizar a ti mismo - no seguro de cómo hacerlo, pero estoy seguro de que no es difícil, o mejor simplemente use los enfoques anteriores.
La diferencia entre @
y <
es que @
hace que el archivo a quedar atado como un archivo de carga, mientras que <
concede el contenido del archivo como un campo de texto.
P.S. El hecho de que esté usando curl
como una forma de generar las solicitudes POST
no significa que las mismas solicitudes HTTP no pudieron ser enviadas desde un lenguaje de programación como Python o usando cualquier herramienta suficientemente capaz.
El pegarse a usar solamente JSON no es realmente necesario tener una web REST Servicio. REST es básicamente todo lo que sigue los principios básicos de los métodos HTTP y algunas otras reglas (posiblemente no estandarizadas). –