Só porque você não está agrupando todo o corpo da solicitação no JSON, não significa que não seja RESTful usar multipart/form-data
para postar o JSON e o (s) arquivo (s) em uma única solicitação:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
no lado do 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 carregar vários arquivos, é possível usar "campos de formulário" separados para cada um:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... nesse caso, o código do servidor terá request.args['file1'][0]
erequest.args['file2'][0]
ou reutilize o mesmo para muitos:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... nesse caso request.args['files']
será simplesmente uma lista de comprimento 2.
ou passe vários arquivos por um único campo:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
... nesse caso request.args['files']
, será uma string contendo todos os arquivos, que você terá que analisar por conta própria - não sabe como fazê-lo, mas tenho certeza de que não é difícil, ou melhor, use as abordagens anteriores.
A diferença entre @
e <
é que @
faz com que o arquivo seja anexado como um upload de arquivo, enquanto<
anexa o conteúdo do arquivo como um campo de texto.
PS Só porque estou usando curl
como uma forma de gerar POST
solicitações não significa que as mesmas solicitações HTTP não puderam ser enviadas de uma linguagem de programação como Python ou usando qualquer ferramenta com capacidade suficiente.