Когда я использую curl
через POST
и устанавливаю, CURLOPT_POSTFIELD
нужно ли мне использовать urlencode
какой-либо специальный формат?
например: если я хочу опубликовать 2 поля, первое и последнее:
first=John&last=Smith
какой точный код / формат следует использовать с curl?
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
http_build_query($data)
поскольку&
это разделитель по умолчанию.РЕДАКТИРОВАТЬ : Начиная с php5 и выше
http_build_query
рекомендуется использовать:Простой пример из мануала:
перед php5:
Из руководства :
Так что что-то вроде этого должно работать отлично (с параметрами, переданными в ассоциативном массиве):
источник
Ни в коем случае не передавайте строку!
Вы можете передать массив и позволить php / curl выполнять грязную работу по кодированию и т. Д.
источник
http_build_query()
с использованием того же массива)Согласно руководству по PHP, данные, передаваемые в cURL в виде строки, должны быть закодированы в URL. Смотрите страницу для curl_setopt () и ищите
CURLOPT_POSTFIELDS
.источник
В
CURLOPT_POSTFIELDS
самом деле, параметры могут быть переданы как строка с URL-кодом, например,para1=val1¶2=val2&..
или как массив с именем поля в качестве ключа и данными поля в качестве значения.Попробуйте следующий формат:
источник
json_encode()
даст вам что-то действительно отличное от действительной строки параметров в видеfirst=John&last=Smith
.json_encode()
выведет:{"first":"John","last":"Smith"}
который затем станет необработанным телом вашего запроса POST.json_encode(...)
dohttp_build_query(...)
. Это создаст ожидаемую «строку в кодировке url», содержащую параметры, разделенные «&».Еще одно важное отличие, которое здесь еще не упоминается, заключается в том, что
CURLOPT_POSTFIELDS
нельзя обрабатывать вложенные массивы.Если мы возьмем вложенный массив,
['a' => 1, 'b' => [2, 3, 4]]
тогда он должен быть параметризован какa=1&b[]=2&b[]=3&b[]=4
([
и]
будет / должно быть закодировано в URL). Он будет автоматически преобразован обратно во вложенный массив на другом конце (при условии, что здесь другой конец также PHP).Это будет работать:
Это не сработает:
Это даст вам уведомление. Выполнение кода продолжится, и ваша конечная точка получит параметр в
b
виде строки"Array"
:источник
Это зависит от
content-type
url-кодированные или multipart / form-data
Чтобы отправлять данные стандартным способом, как браузер с формой, просто передайте ассоциативный массив . Как указано в руководстве PHP:
Кодировка JSON
Тем не менее, при взаимодействии с JSON API содержимое должно быть в кодировке JSON, чтобы API мог понимать наши данные POST.
В таких случаях контент должен быть явно закодирован как JSON:
При обмене данными в формате JSON, мы также обычно устанавливают
accept
иcontent-type
заголовки соответственно:источник
для вложенных массивов вы можете использовать:
источник
Интересно способ Postman выполняет POST как полную операцию GET с двумя дополнительными опциями:
Просто другой способ, и он очень хорошо работает.
источник
Я тоже искал этот ответ целую вечность. Я обнаружил, что все, что вам нужно сделать, это объединить URL-адрес ('?' После имени файла и расширения) со строкой запроса в кодировке URL. Даже не похоже, что вам нужно устанавливать параметры POST cURL. См. Пример подделки ниже:
Вы также можете использовать
file_get_contents()
:источник