136 votes

Dois-je coder les données POST en URL ?

J'envoie des données à une API externe (en utilisant PHP, si c'est pertinent).

Dois-je coder l'URL des variables POST que je passe ?

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


MISE À JOUR : Voici mon PHP, au cas où cela 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);

1 votes

Voici l'API, pour référence : cyclestreets.net/api - il ne semble pas préciser ce qu'il attend.

155voto

DougW Points 9027

Réponse générale

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

Une valeur de "application/x-www-form-urlencoded" signifie que le corps de votre POST devra être codé en URL comme une chaîne de paramètres GET. Une valeur de "multipart/form-data" signifie que vous utiliserez des délimiteurs de contenu et que le contenu ne sera PAS codé par URL.

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


Réponse spécifique

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

Voici les informations pertinentes :

CURLOPT_POST

VRAI pour effectuer un POST HTTP normal. Ce POST est du type normal application/x-www-form-urlencoded, le plus souvent utilisé par les formulaires HTML.

CURLOPT_POSTFIELDS

Les données complètes à afficher dans une opération HTTP "POST". Pour afficher un fichier, faites précéder le nom du fichier de @ et utilisez le chemin d'accès complet. Le type de fichier peut être spécifié explicitement en faisant suivre le nom de fichier du type dans le format ';type=mimetype'. Ce paramètre peut être transmis sous la forme d'une chaîne de caractères urlencodée comme 'para1=val1&para2=val2&...' ou sous la forme d'un tableau avec le nom du champ comme clé et les données du champ comme valeur. Si la valeur est un tableau, l'en-tête Content-Type sera défini comme multipart/form-data. Depuis PHP 5.2.0, la valeur doit être un tableau si les fichiers sont passés à cette option avec le préfixe @.

13voto

skyfree Points 125

@DougW a clairement répondu à cette question, mais j'aimerais quand même ajouter quelques codes ici pour expliquer les points de Doug. (Et corriger les erreurs dans le code ci-dessus)

Solution 1 : Encoder l'URL des données POST avec un en-tête content-type :application/x-www-form-urlencoded .

Remarque : il n'est pas nécessaire de coder les champs $_POST[] un par un, la fonction http_build_query() peut faire 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 : Passez le tableau directement en tant que données du message sans codage d'URL, tandis que l'en-tête Content-Type sera défini comme 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.

1 votes

http_build_query() function can do the urlencoding job nicely. Merci, c'est ce que je cherchais depuis des jours

2voto

user340140 Points 204

Curl va encoder les données pour vous, il suffit de déposer vos données brutes dans le tableau des champs et de lui dire de "partir".

2 votes

J'ai passé des heures à réparer un curl script php où la page web ASP cible me redirige vers une page d'erreur après avoir envoyé des données de post curl et je n'ai pas réussi à comprendre pourquoi. Puis après avoir codé en url les données post, cela a fonctionné et j'ai commencé à obtenir le résultat attendu.

2 votes

Il semble que si c'est un tableau, alors il sera urlencodé automatiquement par curl. si c'est passé comme une chaîne, nous devons urlencoder d'abord.

2voto

Varun Points 51

Les articles ci-dessus répondent aux questions relatives à l'encodage des URL et à son fonctionnement, mais la question originale était "Devrais-je encoder les données POST ?

D'après mon expérience récente de l'encodage des URL, j'aimerais élargir la question. "Devrais-je coder l'URL des données POST, comme la méthode HTTP GET ? En général, les navigateurs effectuent le codage URL des formulaires HTML s'ils sont remplis, soumis et/ou fournissent des informations, mais si une application expose un service Web et attend des consommateurs qu'ils effectuent le codage URL des données, est-il correct, d'un point de vue architectural et technique, d'effectuer le codage URL avec la méthode HTTP POST ?".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X