web-dev-qa-db-fra.com

Dois-je encoder par URL POST data?

Je poste des données sur une API externe (en utilisant PHP, si cela est pertinent).

Dois-je encoder par URL les variables POST que je transmets?

Ou dois-je seulement coder l'URL des données GET?

Merci!

UPDATE: Ceci est mon PHP, au cas où il serait pertinent:

$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);
117
Richard

Réponse générale

La réponse générale à votre question est que cela dépend. Et vous décidez en spécifiant quel est votre "Content-Type" dans les en-têtes HTTP.

Une valeur de "application/x-www-form-urlencoded" signifie que votre corps POST devra être encodé en URL de la même manière qu'une chaîne de paramètres GET. Une valeur de "multipart/form-data" signifie que vous utiliserez des délimiteurs de contenu et NON l'URL codant pour le contenu.

Cette réponse a une explication beaucoup plus approfondie si vous souhaitez plus d'informations.


Réponse spécifique

Pour obtenir une réponse spécifique aux bibliothèques PHP que vous utilisez (CURL), vous devez lisez la documentation ici .

Voici les informations pertinentes:

CURLOPT_POST

TRUE pour faire un HTTP POST normal. Ce POST est le type application/x-www-form-urlencoded normal, le plus couramment utilisé par les formulaires HTML.

CURLOPT_POSTFIELDS

Les données complètes à publier dans une opération HTTP "POST". Pour poster un fichier, ajoutez un @ à un nom de fichier et utilisez le chemin complet. Le type de fichier peut être explicitement spécifié en suivant le nom du fichier avec le type au format '; type = type MIME'. Ce paramètre peut être transmis sous forme de chaîne codée par url, telle que 'para1 = val1 & para2 = val2 & ...' ou sous forme de tableau avec le nom du champ comme clé et les données du champ comme valeur. Si value est un tableau, l'en-tête Content-Type sera défini sur multipart/form-data. A partir de PHP 5.2.0, la valeur doit être un tableau si les fichiers sont passés à cette option avec le préfixe @.

129
DougW

@DougW a clairement répondu à cette question, mais j'aime toujours ajouter quelques codes ici pour expliquer les points de Doug. (Et corrigez les erreurs dans le code ci-dessus)

Solution 1: encodez les données POST avec un en-tête de type de contenu: application/x-www-form-urlencoded.

Remarque: vous n’avez pas besoin d’urlencoder les champs $ _POST [] un par un, la fonction http_build_query () peut effectuer le travail de codage d’url.

$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);

Solution 2: transmettez directement le tableau en tant que données de publication sans codage d'URL, tandis que l'en-tête Content-Type sera défini sur 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);

Les deux extraits de code fonctionnent, mais en utilisant des en-têtes et des corps HTTP différents.

9
skyfree

L'article ci-dessus répond aux questions relatives au codage d'URL et à son fonctionnement, mais la question initiale était "Dois-je coder l'URL POST données?" " qui n'est pas répondu.

De mon expérience récente avec l'encodage d'URL, je voudrais élargir la question. "Si je dois encoder URL POST données, de la même manière que la méthode HTTP GET. En règle générale, les formulaires HTML sur le navigateur si des informations sont renseignées, soumises et/ou GET, les navigateurs effectuent le codage d'URL, mais si une application expose un service Web et attend des consommateurs qu'ils effectuent le codage d'URL sur des données. Est-il correct, d'un point de vue architectural et technique, de procéder à un codage d'URL avec la méthode POST HTTP? "

2
Varun

curl va encoder les données pour vous, il suffit de déposer vos données de champ brutes dans le tableau de champs et de lui dire de "disparaître".

2
user340140