laravel. Мне нужно с одного на другой передать файл + некоторые данные.
То есть КЛИЕНТ ->(отправил данные с файлом)->БЭК1->(отправил данные с файлом)->БЭК2
Я хочу сохранять вложенность параметров, и сделать этот момент максимально гибким.
Поэтому решил использовать HTTP::attach
Написал рекурсивный метод, который пробегается по всем элементам массива, и если это файл, то в запрос подкидывает его через attach. На выходе такой код
$response = Http::withHeaders(['Accept' => 'application/json']);
self::attachFilesToRequest($data, $response);
$response = $response->post($url, $data);
Но к сожалению проблема оказалась в том, что, если запрос комбинированный , то на месте ->post($url, ВОТ ТУТ он хочет видеть уже массив такого типа
[
[
'name' => 'params 1',
'content' => 'content....'
]
])
Иначе я получаю ошибку A 'contents' key is required
https://stackoverflow.com/questions/68409031/laravel-post-file-with-httpattach-error-a-contents-key-is-required
вот такая же проблема.
Собственно сам вопрос. Есть ли варианты полегче? Или придётся ещё рекурсивно собирать параметры.
Надеюсь, что нормально объяснил, спасибо за внимание
А какую проблему ты изначально решаешь? Ты описал свой способ решения, но не задачу
Мой способ решения не работает( Проблема в том, что я не могу передать по HTTP:client данные с файлами на второй сервер.Либо могу передать данные, но не файл, либо могу к запросу подкинуть файлы, через attach, но тогда данные нужно в виде multipart передать, а я что-то не могу понять, как вложенность массива данных сохранить, при таком требовании.
Прям надо файлом, или просто запрос переслать с одного сервиса на другой ?
Думаю, что файлом. Вариант перенапрапавить запрос не подойдёт, так как на первом бэке, я могу подкинуть что-то в данные, в общем данные нужны для некоторой логики. Я на втором бэке хочу получить свои данные в той же иерархии, в которой и отправил + чтобы мог спокойно работать с файлом, например $request->data['fale']->getClientOriginalName() и т.д. Если существует вариант подкинуть некоторые данные в запрос и перенаправить на второй бэк, то тоже будет круто
Не делай это в реалтайме. 1. Сохрани файл 2. В очередь поставь обогащение данными. 3. После завершения шага 2 - в очередь ставь отправку на БЭК2 4. По необходимости отправь клиенту сообщение в сокет, что все збс обработано
Окей, это я понимаю. Но проблема именно в том, как отправить файл\файлы, вместе с данными, если HTTP::attach так себя ведёт(ссылка, которую я прикреплял выше). Я понимаю, что долгие действия должны попадать в очередь, чтобы клиент не ждал.
Блин, ну тогда гугли по Guzzle proxy request to different server
Если хочешь решать задачу именно таким путем, попробуй альтернативные варианты вплоть до прямого использования curl. Бывает что либы специфически отрабатывают некоторые кейсы и тут либо идешь в код либы и делаешь PR чтобы это пофиксить у них, либо ищешь альтернативные решения.
Тоже вот думаю про curl
Но вообще все эти перекидывания запросами в реалтайме выглядят как костыли 🙂
В реалтайме временно. Но джоба же тут не исправит проблему. Архитектура действительно костыльная самой приложухи, что приходится с одного бэка на второй кидать. Там типа второй общий, но и через первый необходимо данные пропустить( Поэтому так. Вот столкнулся с файлами и что-то прифигел, хотя казалось бы тривиально задача выглядит(
ну обычно когда несколько серверов и нужно на всех с файлами работать, делают общее хранилище через s3 или sftp какой нибудь как выше писали. Файл сохраняешь сразу, а мета информацию по частям в рамках своих процессов, при этом сам файл будет везде доступен
Тогда так и сделаю, а то уже два дня вожусь с этим. Спасибо за совет
Обсуждают сегодня