Должен ли я кодировать данные POST?

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

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

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

Спасибо!

UPDATE: Это мой 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);

Ответ 1

Общий ответ

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

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

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


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

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

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

CURLOPT_POST

ИСТИНА, чтобы выполнить обычный HTTP POST. Этот POST - это обычный тип приложения /x -www-form-urlencoded, наиболее часто используемый HTML-формами.

CURLOPT_POSTFIELDS

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

Ответ 2

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

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

Примечание: вам не нужно вводить urlencode $_POST [] по одному, функция 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.

Ответ 3

curl будет кодировать данные для вас, просто отбросьте данные необработанного поля в массив полей и скажите "идти".