El hecho de que no esté envolviendo todo el cuerpo de la solicitud en JSON, no significa que no sea RESTful usar multipart/form-data
para publicar tanto el JSON como los archivos en una sola solicitud:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
en el lado del servidor (usando Python para pseudocódigo):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
para cargar múltiples archivos, es posible usar "campos de formulario" separados para cada uno:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... en cuyo caso el código del servidor tendrá request.args['file1'][0]
yrequest.args['file2'][0]
o reutilice el mismo para muchos:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... en cuyo caso request.args['files']
simplemente será una lista de longitud 2.
o pasar múltiples archivos a través de un solo campo:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... en cuyo caso request.args['files']
será una cadena que contiene todos los archivos, que tendrá que analizar usted mismo, no estoy 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 se adjunte como una carga de archivo, mientras que <
adjunta el contenido del archivo como un campo de texto.
PD: Solo porque lo estoy usando curl
como una forma de generar las POST
solicitudes no significa que no se puedan enviar exactamente las mismas solicitudes HTTP desde un lenguaje de programación como Python o usando una herramienta suficientemente capaz.