169 похожих чатов

Привет всем! Столкнулся с следующей проблемой. У меня есть два сервера на

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

вот такая же проблема.

Собственно сам вопрос. Есть ли варианты полегче? Или придётся ещё рекурсивно собирать параметры.

Надеюсь, что нормально объяснил, спасибо за внимание

13 ответов

28 просмотров

А какую проблему ты изначально решаешь? Ты описал свой способ решения, но не задачу

Артём- Автор вопроса
Andrey Kolesnikov
А какую проблему ты изначально решаешь? Ты описал ...

Мой способ решения не работает( Проблема в том, что я не могу передать по HTTP:client данные с файлами на второй сервер.Либо могу передать данные, но не файл, либо могу к запросу подкинуть файлы, через attach, но тогда данные нужно в виде multipart передать, а я что-то не могу понять, как вложенность массива данных сохранить, при таком требовании.

Артём
Мой способ решения не работает( Проблема в том, ч...

Прям надо файлом, или просто запрос переслать с одного сервиса на другой ?

Артём- Автор вопроса

Думаю, что файлом. Вариант перенапрапавить запрос не подойдёт, так как на первом бэке, я могу подкинуть что-то в данные, в общем данные нужны для некоторой логики. Я на втором бэке хочу получить свои данные в той же иерархии, в которой и отправил + чтобы мог спокойно работать с файлом, например $request->data['fale']->getClientOriginalName() и т.д. Если существует вариант подкинуть некоторые данные в запрос и перенаправить на второй бэк, то тоже будет круто

Артём
Думаю, что файлом. Вариант перенапрапавить запрос ...

Не делай это в реалтайме. 1. Сохрани файл 2. В очередь поставь обогащение данными. 3. После завершения шага 2 - в очередь ставь отправку на БЭК2 4. По необходимости отправь клиенту сообщение в сокет, что все збс обработано

Артём- Автор вопроса
Andrey Kolesnikov
Не делай это в реалтайме. 1. Сохрани файл 2. В оч...

Окей, это я понимаю. Но проблема именно в том, как отправить файл\файлы, вместе с данными, если HTTP::attach так себя ведёт(ссылка, которую я прикреплял выше). Я понимаю, что долгие действия должны попадать в очередь, чтобы клиент не ждал.

Артём
Окей, это я понимаю. Но проблема именно в том, как...

Блин, ну тогда гугли по Guzzle proxy request to different server

Артём
Окей, это я понимаю. Но проблема именно в том, как...

Если хочешь решать задачу именно таким путем, попробуй альтернативные варианты вплоть до прямого использования curl. Бывает что либы специфически отрабатывают некоторые кейсы и тут либо идешь в код либы и делаешь PR чтобы это пофиксить у них, либо ищешь альтернативные решения.

Артём- Автор вопроса

Тоже вот думаю про curl

Артём
Тоже вот думаю про curl

Но вообще все эти перекидывания запросами в реалтайме выглядят как костыли 🙂

Артём- Автор вопроса
Sergey Shitikov
Но вообще все эти перекидывания запросами в реалта...

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

Артём
В реалтайме временно. Но джоба же тут не исправит ...

ну обычно когда несколько серверов и нужно на всех с файлами работать, делают общее хранилище через s3 или sftp какой нибудь как выше писали. Файл сохраняешь сразу, а мета информацию по частям в рамках своих процессов, при этом сам файл будет везде доступен

Артём- Автор вопроса
Sergey Shitikov
ну обычно когда несколько серверов и нужно на всех...

Тогда так и сделаю, а то уже два дня вожусь с этим. Спасибо за совет

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта