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


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

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

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

спасибо!

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);
3 110

3 ответа:

Общий Ответ

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

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

этот ответ имеет много более подробное объяснение если вы хотите получить больше информации.


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

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

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

CURLOPT_POST

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

CURLOPT_POSTFIELDS

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

@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.

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