Должен ли я URL-кодировать данные POST? - PullRequest
117 голосов
/ 07 июля 2011

Я размещаю данные во внешнем API (используя PHP, если это актуально).

Должен ли я кодировать URL-адреса переменных POST, которые я передаю?

Или мне нужно только кодировать URL-адреса GET?

ОБНОВЛЕНИЕ: Это мой PHP, на случай, если он уместен:

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
    'datetime'=>urlencode($_POST["datetime"]),
    'category'=>urlencode($_POST["category"]),
    'metacategory'=>urlencode($_POST["metacategory"]),
    'caption'=>($_POST["description"])
);
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

Ответы [ 4 ]

128 голосов
/ 04 апреля 2012

Общий ответ

Общий ответ на ваш вопрос заключается в том, что это зависит. И вы можете решить, указав, какой ваш «тип контента» находится в заголовках HTTP.

Значение «application / x-www-form-urlencoded» означает, что ваше тело POST должно быть закодировано в URL, как строка параметров GET. Значение «multipart / form-data» означает, что вы будете использовать разделители контента, а НЕ URL-кодировку контента.

Этот ответ содержит гораздо более подробное объяснение , если вам нужна дополнительная информация.


Конкретный ответ

Для ответа, относящегося к используемым вами библиотекам PHP (CURL), вам следует прочитать документацию здесь .

Вот соответствующая информация:

CURLOPT_POST

TRUE для выполнения обычного HTTP POST. Этот POST - это обычный тип application / x-www-form-urlencoded, наиболее часто используемый формами HTML.

CURLOPT_POSTFIELDS

Полные данные для отправки в HTTP-операции «POST». Чтобы опубликовать файл, добавьте @ к имени файла и используйте полный путь. Тип файла можно явно указать, следуя имени файла с типом в формате '; type = mimetype'. Этот параметр может быть передан в виде строки в кодировке urlen, например, 'para1 = val1 & para2 = val2 & ...', или в виде массива с именем поля в качестве ключа и данными поля в качестве значения. Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0 значение должно быть массивом, если файлы передаются в эту опцию с префиксом @.

9 голосов
/ 19 июля 2014

@ ДугВ четко ответил на этот вопрос, но я все еще хотел бы добавить сюда несколько кодов, чтобы объяснить точку зрения Дуга.(И исправьте ошибки в приведенном выше коде)

Решение 1: URL-кодирование данных POST с заголовком типа содержимого: application / x-www-form-urlencoded.

Примечание: выне нужно поочередно кодировать поля $ _POST [] urlencode, функция http_build_query () может выполнять работу urlencoding.

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>$_POST["username"],
    'password'=>$_POST["password"],
    'latitude'=>$_POST["latitude"],
    'longitude'=>$_POST["longitude"],
    'datetime'=>$_POST["datetime"],
    'category'=>$_POST["category"],
    'metacategory'=>$_POST["metacategory"],
    'caption'=>$_POST["description"]
);

$fields_string = http_build_query($fields);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

Решение 2. Передача массива напрямую как данных публикации без URL-кодировкив то время как заголовок Content-Type будет установлен в multipart / form-data.

$fields = array(
        'mediaupload'=>$file_field,
        'username'=>$_POST["username"],
        'password'=>$_POST["password"],
        'latitude'=>$_POST["latitude"],
        'longitude'=>$_POST["longitude"],
        'datetime'=>$_POST["datetime"],
        'category'=>$_POST["category"],
        'metacategory'=>$_POST["metacategory"],
        'caption'=>$_POST["description"]
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);

Оба фрагмента кода работают, но используют разные заголовки и тела HTTP.

2 голосов
/ 11 ноября 2018

Выше сообщений отвечает на вопросы, связанные с кодировкой URL и как это работает, но оригинальные вопросы были "Должен ли я кодировать данные POST в URL?"на который нет ответа.

Из моего недавнего опыта с кодировкой URL я хотел бы расширить этот вопрос.«Если мне нужно URL-кодирование данных POST, аналогично методу GET HTTP. Как правило, HTML формируется в браузере, если он заполнен, отправлен и / или получит некоторую информацию, браузеры будут выполнять кодирование URL, но если приложение предоставляет веб-сервис и ожидаетПотребители для кодирования URL-адресов на данных, архитектурно и технически правильно делать кодирование URL-адреса методом HTTP POST? "

2 голосов
/ 27 мая 2013

curl закодирует данные для вас, просто перетащите ваши необработанные данные поля в массив полей и скажите, что они «идут».

...