php - Отправка массива через CURLOPT_POSTFIELDS

Я много публикую через PHP CURL. Как правило, мы отправляем на серверы, которые ожидают прямой HTTP POST или JSON. Итак, мы строим параметры в виде массива... а затем json_encode массив или http_build_query массив... и публикуем результат в CURLOPT_POSTFIELDS. Кто-то запрограммировал для нас несколько веб-страниц... и они разместили данные формы через дополнительную страницу, отправив массив $_POST на наш сервер... и это сработало! Конечно, достаточно, я посмотрел спецификации для CURLOPT_POSTFIELDS... и он может принимать строку или массив. Итак, я запутался... почему кажется, что протокол должен преобразовать массив в строку с помощью http_build_query, когда можно просто опубликовать массив (по крайней мере, если он одномерный)? Это только из-за побочного преимущества кодирования URL-адреса http_build_query.... или есть другая причина?

P.S. Когда массив содержал параметр, который был полным URL-адресом, то есть с запросом, например http://example.com?a=1&b=2&c=3 сервер нормально считывает данные, даже если параметр не был закодирован в URL-адресе... или публикация массива автоматически кодирует элементы массива?


person PhoenixTech    schedule 07.08.2020    source источник


Ответы (2)


Тип значения, которое вы передаете CURLOPT_POSTFIELDS, влияет на Content-type вашего запроса. Если CURLOPT_POSTFIELDS является массивом, тип содержимого вашего запроса будет multipart/form-data.

Если CURLOPT_POSTFIELDS является строкой application/x-www-form-urlencoded.

Теперь то, что произошло (из вашего вопроса), заключается в том, что PHP может обнаруживать ваши параметры POST независимо от типа контента. Так что оба способа отправки запроса пройдут.

Вы также можете взглянуть на этот вопрос, чтобы узнать, что лучше для какой ситуации. Другая ссылка

person Prince Dorcis    schedule 08.08.2020
comment
Спасибо, @PrinceDorcis. Особенно по дополнительным ссылкам. Конечно, я просмотрел существующие сообщения перед публикацией. Хотя не все можно найти. - person PhoenixTech; 12.08.2020

передача любых данных через http(s) — это передача strings, это протокол text transfer, даже если вы явно не конвертируете массив в строку (с помощью json_encode() или http_build_query()), cURL сделает это за вас.

person Игорь Тыра    schedule 07.08.2020
comment
Если да, то каков ответ на мой вопрос? Какова цель http_build_query()... и почему принятый протокол использует его? - person PhoenixTech; 08.08.2020
comment
Целью http_build_query является сериализация данных массива (в кодировку application/x-www-form-urlencoded) для передачи по протоколу передачи текста. а затем, с другой стороны, данные автоматически десериализуются в массив. - person Игорь Тыра; 08.08.2020