To, że nie pakujesz całego ciała żądania w JSON, nie oznacza, że RESTful nie może używać multipart/form-data
zarówno JSON, jak i plików w jednym żądaniu:
curl -F "metadata=<metadata.json" -F "file=@my-file.tar.gz" http://example.com/add-file
po stronie serwera (używając Pythona dla pseudokodu):
class AddFileResource(Resource):
def render_POST(self, request):
metadata = json.loads(request.args['metadata'][0])
file_body = request.args['file'][0]
...
aby przesłać wiele plików, można użyć osobnych „pól formularza” dla każdego:
curl -F "metadata=<metadata.json" -F "file1=@some-file.tar.gz" -F "file2=@some-other-file.tar.gz" http://example.com/add-file
... w takim przypadku kod serwera będzie miał request.args['file1'][0]
irequest.args['file2'][0]
lub użyj tego samego dla wielu:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz" -F "files=@some-other-file.tar.gz" http://example.com/add-file
... w takim przypadku request.args['files']
będzie to po prostu lista długości 2.
lub prześlij wiele plików przez jedno pole:
curl -F "metadata=<metadata.json" -F "files=@some-file.tar.gz,some-other-file.tar.gz" http://example.com/add-file
...w którym to przypadku request.args['files']
będzie ciąg znaków zawierający wszystkie pliki, które będziesz musiał sam przeanalizować - nie wiem, jak to zrobić, ale jestem pewien, że nie jest to trudne, albo lepiej po prostu użyj poprzednich podejść.
Różnica między @
i <
polega na tym, @
że plik zostaje dołączony jako przesyłany plik, a <
zawartość pliku jest dołączana jako pole tekstowe.
PS To, że używam curl
jako sposobu generowania POST
żądań, nie oznacza, że dokładnie takie same żądania HTTP nie mogą być wysyłane z języka programowania, takiego jak Python, ani za pomocą jakiegokolwiek wystarczająco sprawnego narzędzia.