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

122

Je POSTE des données sur une API externe (en utilisant PHP, si c'est pertinent).

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

Ou dois-je uniquement encoder des données GET à l'URL?

Merci!

MISE À JOUR: 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);
Richard
la source
1
Ceci est l'API, pour référence: cyclestreets.net/api - il ne semble pas spécifier ce qu'il attend.
Richard

Réponses:

137

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 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 comme une chaîne de paramètres GET. Une valeur de "multipart / form-data" signifie que vous utiliserez des délimiteurs de contenu et PAS d'URL encodant le contenu.

Cette réponse a une explication beaucoup plus approfondie si vous souhaitez 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

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

CURLOPT_POSTFIELDS

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

DougW
la source
9

@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 en URL les données POST avec un en-tête de type content: application / x-www-form-urlencoded.

Remarque: vous n'avez pas besoin de coder url les champs $ _POST [] un par un, la fonction http_build_query () peut bien faire le travail de codage 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 le tableau directement en tant que données de publication sans encodage 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 utilisent des en-têtes et des corps HTTP différents.

sans ciel
la source
2

curl encodera les données pour vous, déposez simplement vos données de champ brutes dans le tableau de champs et dites-lui de "go".

user340140
la source
1
J'ai passé des heures à corriger un script php curl où la page Web ASP cible me redirige vers une page d'erreur après l'envoi des données de publication curl et je n'ai pas pu comprendre pourquoi. Ensuite, après avoir encodé l'URL des données de publication, cela a fonctionné et j'ai commencé à obtenir le résultat attendu.
Robi
1
il regarde s'il s'agit d'un tableau, alors il sera automatiquement codé url par curl. s'il est passé sous forme de chaîne, nous devons d'abord urlencode.
Robi
2

Les articles ci-dessus répondent aux questions relatives à l'encodage d'URL et à son fonctionnement, mais les questions d'origine étaient "Dois-je encoder des données POST en URL?" qui ne répond pas.

De mon expérience récente avec l'encodage d'URL, je voudrais étendre la question plus loin. "Dois-je encoder des données POST en URL, comme la méthode GET HTTP. En règle générale, les formulaires HTML sur le navigateur sont remplis, soumis et / ou OBTIENNENT des informations, les navigateurs effectuent un encodage d'URL, mais si une application expose un service Web et attend Les consommateurs doivent effectuer un encodage d'URL sur les données, est-il correct d'un point de vue architectural et technique de faire l'encodage d'URL avec la méthode HTTP POST? "

Varun
la source