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

122

Я отправляю данные во внешний 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);
Ричард
источник
1
Это API для справки: cyclestreets.net/api - похоже, он не указывает, чего он ожидает.
Ричард

Ответы:

137

Общий ответ

Общий ответ на ваш вопрос - это зависит от обстоятельств. И вы можете решить, указав ваш «Content-Type» в заголовках 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'. Этот параметр может быть передан как строка с URL-кодом, например 'para1 = val1 & para2 = val2 & ...', или как массив с именем поля в качестве ключа и данными поля в качестве значения. Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, значение должно быть массивом, если файлы передаются в эту опцию с префиксом @.

DougW
источник
9

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

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

Примечание: вам не нужно кодировать поля $ _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.

skyfree
источник
2

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

user340140
источник
1
Я потратил часы на исправление скрипта php curl, где целевая веб-страница ASP перенаправляет меня на страницу с ошибкой после отправки данных curl post, и я не мог понять, почему. Затем, после кодирования URL-адреса данных сообщения, это сработало, и я начал получать ожидаемый результат.
Роби
1
он выглядит, если это массив, тогда он будет автоматически закодирован с помощью curl. если он передается как строка, нам нужно сначала указать urlencode.
Роби
2

Вышеупомянутые сообщения отвечают на вопросы, связанные с кодированием URL-адресов и принципами его работы, но исходные вопросы были «Следует ли мне кодировать URL-адреса POST-данных?» на который нет ответа.

Исходя из моего недавнего опыта работы с кодированием URL, я хотел бы расширить вопрос. "Должен ли я кодировать данные POST по URL так же, как метод GET HTTP. Обычно HTML-формы через браузер, если они заполнены, отправлены и / или ПОЛУЧАЮ некоторую информацию, браузеры будут выполнять кодирование URL, но если приложение предоставляет веб-службу и ожидает Потребители должны выполнять кодирование URL-адресов данных, правильно ли с архитектурной и технической точки зрения выполнять кодирование URL-адресов с помощью метода POST HTTP? "

Варуна
источник