Составной PUT в PHP (данные и файлы)

Мне было поручено создать API для существующего мобильного приложения. Приложение отправляет составные данные и файлы в одном запросе PUT. В качестве примера, существует конечная точка PUT / api / employee / personal-info (обратите внимание на отсутствие идентификатора в URI), которая является составной частью - данные JSON и 2 изображения.

PHP не имеет встроенной поддержки PUT, он не очень хорошо помещает все в $ _FILES и $ _POST, поэтому мне приходится декодировать ввод вручную.

Сначала мне нужно сделать file_get_contents("php://input"), который дает мне необработанные данные. Мне нужно использовать регулярное выражение для извлечения граничной строки, затем мне нужно разделить ввод на блоки, используя эту границу (и снова регулярное выражение), а затем решить, является ли блок JSON или файлом, просмотрев Content-Disposition на каждом из блоки. Если это файл, мне нужно повторно определить имя файла и расширение, а также вручную заполнить массив $ _FILES.

У блоков Json есть эти заголовки (внутри тела, непосредственно перед фактическими данными)

Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=model

а файловые блоки имеют только это:

Content-Disposition: form-data; name=file; filename=IMG_20180208_1.jpg; filename*=utf-8’’IMG_20180208_1.jpg

Таким образом, Content-Disposition для всего ввода - это multipart / form-data, но тогда каждый из блоков имеет свои собственные заголовки, в зависимости от того, является ли это файлом или данными JSON.

Неужели это единственный способ сделать это в PHP? Должны ли конечные точки PUT НЕ быть, как правило, составными, когда дело доходит до PHP? Я что-то пропустил?

Я бы сказал, что отсутствие поддержки PUT в PHP не делает идею составной PUT менее актуальной; да, это чертовски раздражает, и это означает, что вам придется написать какой-то уродливый код синтаксического анализа, но с точки зрения приложения это разумная вещь.

Graham 07.06.2018 09:27

Есть ли какие-то основные правила того, какие заголовки должны быть включены в каждый блок и должны ли они иметь определенный формат? Когда вы смотрите на те, что в вопросе, нет кавычек вокруг имени файла и т. д., Почтальон выплевывает заголовки, немного отличающиеся от тех, которые я получаю из приложения.

Varin 07.06.2018 10:13

Существуют «основные правила» с точки зрения спецификаций RFC (см. Ссылки из developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…), но, как вы видели, пользовательские агенты могут игнорировать спецификации и игнорируют их. Предположительно вы создаете частный API для этого приложения, поэтому я бы работал с тем, что приложение уже отправляет, а не в строгом соответствии со спецификациями.

Graham 07.06.2018 10:49

@ Грэм, ясно. Я бы подумал, что существуют определенные строгие правила, касающиеся синтаксиса HTTP-запросов и т. д. Но потом я также подумал, что в PHP будет поддержка PUT, аналогичная поддержке POST. Я ни в коем случае не старший разработчик, но это застало меня врасплох. В конце концов мне удалось написать класс, который декодирует и разбивает ввод на блоки, а затем помещает все в соответствующие массивы, сохраняет несколько файлов и т. д., Но это было мучительно ... Ребята из .NET в офисе сказали, что им никогда не приходилось иметь дело с эта проблема и я завидую.

Varin 07.06.2018 19:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
213
0

Другие вопросы по теме