Чи слід кодувати URL-адреси POST-даних?


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

Загальна відповідь

Загальна відповідь на ваше запитання полягає в тому, що це залежить. Ви можете вирішити, вказавши, що ваш "Тип вмісту" в заголовках HTTP.

Значення "application / x-www-form-urlencoded" означає, що ваше тіло POST потрібно буде кодувати URL так само, як рядок параметра GET. Значення "багаточастинних / форм-даних" означає, що ви будете використовувати роздільники вмісту, а НЕ URL-код, що кодує вміст.

Ця відповідь має набагато більш ретельне пояснення, якщо ви хочете отримати більше інформації.


Конкретний відповідь

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

Ось відповідна інформація:

CURLOPT_POST

ПРАВИЛЬНО робити звичайний HTTP POST. Цей POST - це звичайний додаток / x-www-form-urlencoded, найчастіше використовується у формах HTML.

CURLOPT_POSTFIELDS

Повні дані для публікації в операції HTTP "POST". Щоб опублікувати файл, додайте ім’я файла @ і скористайтеся повним шляхом. Файл можна точно вказати, дотримуючись імені файлу з типом у форматі '; type = mimetype'. Цей параметр може бути переданий у вигляді рядка, що кодується urlen, як "para1 = val1 & para2 = val2 & ...", або як масив із назвою поля як ключовим, а дані поля - як значення. Якщо значення - це масив, заголовок Content-Type буде встановлено на багаточастинні / форми-дані. Станом на PHP 5.2.0, значення має бути масивом, якщо файли передаються до цієї опції з префіксом @.


9

@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 буде встановлено на багаточастинні / форми-дані.

$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

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


1
Я витратив години на те, щоб виправити скрипт php curl, коли цільова веб-сторінка ASP перенаправляє мене на сторінку помилок після надсилання даних публікації curl, і я не зміг з’ясувати, чому. Потім після URL-кодування даних публікації це спрацювало, і я почав отримувати очікуваний результат.
Робі

1
виглядає, якщо це масив, то він буде зашифрований автоматично за допомогою завивки. якщо він передається як рядок, нам потрібно спочатку urlencode.
Робі

2

Вищі публікації відповідають на питання, що стосуються кодування URL-адрес та як це працює, але початкові запитання були "Чи слід кодувати URL-адреси POST-даних?" на що не відповіли.

З мого недавнього досвіду кодування URL-адрес, я хотів би продовжити питання. "Якщо я повинен кодувати URL-дані POST, такі ж, як метод GET HTTP. Як правило, HTML-форми через браузер, якщо вони заповнені, подані та / або отримують певну інформацію, браузери будуть робити кодування URL-адрес, але якщо програма відкриває веб-сервіс і очікує Споживачі робити URL-кодування даних, чи правильно в архітектурному та технічному відношенні робити кодування URL-адреси методом POST HTTP? "

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.