curl application x www form urlencoded

Для HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded и multipart/form-data . Алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы.

Со временем возникла необходимость через формы отсылать еще и файлы. Тогда консорциум W3C взялся за доработку формата POST запроса. К тому времени уже достаточно широко применялся формат MIME (Multipurpose Internet Mail Extensions — многоцелевые расширения протокола для формирования Mail сообщений), поэтому, чтобы не изобретать велосипед заново, решили использовать часть данного формата формирования сообщений для создания POST запросов в протоколе HTTP.

Главное отличие multipart/form-data от application/x-www-form-urlencoded в том, что тело запроса теперь можно поделить на разделы, которые разделяются границами. Каждый раздел может иметь свой собственный заголовок для описания данных, которые в нем хранятся, т.е. в одном запросе можно передавать данные различных типов (как в теле письма можно одновременно с текстом передавать файлы). Пример запроса:

Boundary (граница) — это последовательность байтов, которая не должна встречаться внутри передаваемых данных. Content-Length — суммарный объём, включая дочерние заголовки. Само содержимое полей при этом оставляется «как есть».

CURL, multipart/form-data

Файл get.php на сервере :

Важный момент: на форуме PHPCLUB.RU встретил упоминание, что может потребоваться указание полного пути файла — иначе CURL выдает ошибку.

CURL, application/x-www-form-urlencoded

Файл get.php на сервере :

Сокеты, multipart/form-data

Файл get.php на сервере :

Сокеты, application/x-www-form-urlencoded

Файл get.php на сервере :

Метод PUT

Описанные выше способы работают для относительно небольших файлов (примерно до 2-х мегабайт, для получения более точного значения необходимо смотреть в настройках PHP максимальный объем принимаемых данных методом POST). Чтобы обойти это ограничение, будем передавать файл методом PUT:

Я смог использовать клиентское расширение Advanced Rest для Chrome, чтобы отправлять запросы POST на определенный сервер HTTPS, и я получаю код состояния: 200 — ОК с теми же полями тела, что и в этом коде, но когда я запускаю следующий код я получаю этот ответ: 403 — доступ запрещен.

Я также заметил, что когда я использую Advanced Rest Client Extension для Chrome и если я устанавливаю Content-Type на application / json, я должен ввести логин и пароль, которые я не знаю, что это такое, потому что даже если я введите идентификатор и секретный ключ, который у меня есть в коде, он возвращает 401 Несанкционированный. Поэтому я предполагаю, что этот код, который я написал, не принуждает его к типу содержимого: application / x-www-form-urlencoded, но я не уверен. Спасибо за любую помощь в этом вопросе!

Решение

Можете ли вы попробовать так и посмотреть, поможет ли это:

Я предполагаю, что сайт ожидает простой аутентификации на вершине secret_key что вы уже предоставили.
Также есть возможность отправить Cookie, поэтому на всякий случай лучше сохранить его и использовать снова при следующих вызовах Curl.

Я хочу загрузить видео прямо на Youtube с моего сервера, для которого я использую PHP curl.

Мне нужен этот формат запроса:

Это то, что у меня есть:

Сбрасывание результата показывает, что завиток изменил Content-Type на application/x-www-form-urlencoded который, конечно же, не поддерживается youtube.

Я помещаю свой двоичный контент (видео) в CURLOPT_POSTFIELDS , возможно, это неправильно, но я не знаю, как установить тело запроса, кроме этого.

Итак, как мне сохранить свой Content-Type, который я установил?

Согласно разделу документации, касающемуся параметра параметров, для HTTP-метода POST умолчанию используется тип контента, который устанавливается в application/x-www-form-urlencoded . Поэтому я подозреваю, что установка всех параметров сразу приводит к тому, что ваш Content-Type перезаписывается.
Мое предложение состояло в том, чтобы установить тип содержимого в один оператор после того, как вы установили метод, т.е.

Принятый ответ не помог мне, и я нашел еще одну проблему в вашем коде. Согласно текущей документации PHP CURLOPT_HTTPHEADER должен быть установлен следующим образом:

Это должен быть список строк, а не хэш- array(‘Content-Type’ => ‘text/plain’) . Надеюсь, что это сэкономит время отладки.

Оцените статью