Могу ли я иметь тело и файл в форме данных HTTP-запроса? - PullRequest
2 голосов
/ 10 июля 2020

Я работаю в репозитории Go Lang REST API.

Я хочу создать конечную точку, которая будет принимать файл (как часть данных формы, поэтому я полагаю, что буду использовать request.FormFile('my-file-key')). Эта конечная точка также должна принимать тело модели JSON (которая, я полагаю, будет расшифрована примерно так:

var myData model.MyModel
json.NewDecoder(request.Body).Decode(&myData)

Но у меня много проблем. Возможно ли это? отправить как тело, так и файл в форме-данных с помощью http-запроса?

Если я попытаюсь отправить оба, я получаю сообщение об ошибке FormFile, в котором говорится, что он не может найти файл с именем ключа (но если я отправлю точно такой же запрос без тела, этой ошибки не произойдет). Я предполагаю, что у него проблемы с декодированием запроса.

1 Ответ

2 голосов
/ 10 июля 2020

Что вам нужно, так это составной запрос. Одна часть может быть данными JSON, а другая - данными файла.

Если вы используете клиент Go для подготовки запроса, вам необходимо использовать пакет mime/multipart для создания Writer, затем используйте CreatePart для создания части JSON, затем файловой части и отправьте запрос на сервер.

На стороне декодирования: поскольку тело JSON, вы не можете проанализируйте его как форму. Вы должны использовать multipart.Reader для чтения из тела после синтаксического анализа заголовков. Опять же, от этого считывателя вы получаете Part и считываете данные из этой части. Вы получите две части: одну для данных JSON и одну для данных файла.

...