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 ответов

11 просмотров

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

Артём- Автор вопроса
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
ну обычно когда несколько серверов и нужно на всех...

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

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
Подскажите, есть какие-то события создания/уничтожения у TFrame по типу TForm (OnCreate и OnClose/OnDestroy) ? Как отловить создание TFrame и "перед" уничтожением. На Tframe р...
Денис
8
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
а чем хуже?
Alexey Kulakov
10
Карта сайта