Нам нужно отправить multipart/form-data
запрос, содержащий два файла. Поскольку у нас возникли некоторые проблемы с запросами, мы настроили страницу bin запроса, чтобы попытаться проанализировать сами запросы, поскольку Postman, похоже, работал нормально.
Мой второй файл создается другим сервисом в виде потока байтов и представляет собой JSON
объект. Этот поток байтов, похоже, имеет в конце NUL
(0) байт-терминатор.
Если я добавлю этот второй файл в запрос multipart/form-data
, получится что-то вроде следующих результатов:
Если тело выглядит следующим образом:
--9ac41cec-a0ff-4afd-b687-6b8c2f1bddd6.
Content-Disposition: form-data; name="metadata"; filename="metadata-1584981615.json".
Content-Type: application/json.
Content-Length: 581.
.
{"...":"..."}.
--9ac41cec-a0ff-4afd-b687-6b8c2f1bddd6.
Content-Disposition: form-data; name="file"; filename="file-1584981615.json".
Content-Type: application/json.
Content-Length: 12205.
.
{"...":"..."}..
--9ac41cec-a0ff-4afd-b687-6b8c2f1bddd6--.
Очевидно, это в высшей степени неверно. Похоже, что запрос multipart
добавляет символы .
в конце каждой строки.
Мне удалось воспроизвести это поведение с Spring Web 5.1.5.RELEASE
, okHttp 3.14.7
и Apache HttpComponents 4.5.7
. Поведение, по-видимому, не меняется, если я удаляю терминатор байтов NUL
(0) из потока байтов.
Вот странная часть: принимающий веб-сервер принимает этот запрос как действительный multipart/form-data
request.
Для записи вот как выглядит действительный запрос (который также принимается веб-сервером) с точки зрения bin запроса (другой file
):
--83611e7f-ad57-4893-9d1b-5ba2c4543d2a
Content-Disposition: form-data; name="metadata"; filename="metadata-1584982345.json"
Content-Type: application/json
Content-Length: 895
{"...": "..."}
--83611e7f-ad57-4893-9d1b-5ba2c4543d2a
Content-Disposition: form-data; name="file"; filename="file-1584982345.json"
Content-Type: application/json
Content-Length: 9868
{"...": "..."}
--83611e7f-ad57-4893-9d1b-5ba2c4543d2a--
Помимо наличия явного терминатора в конце (который, кажется, не имеет значения вообще), поток байтов не выглядит нарушенным. new String(bytes)
дает действительный JSON
объект. Поэтому я думаю, что это должно быть что-то еще.
Кто-нибудь сталкивался с этой проблемой раньше? Я не уверен, как приступить к отладке этой проблемы, и я вполне уверен, что отправка неправильных запросов, даже если они могут быть приняты удаленным сервером в это время, почти наверняка гарантирует, что мой код сломается где-нибудь вдоль линии. ..