web-dev-qa-db-fra.com

CURLOPT_POST vs CURLOPT_POSTFIELDS: l'option CURLOPT_POST est-elle requise?

Je suis nouveau pour cURL en PHP. J'ai une question concernant l'utilisation des options de boucle.

Considérez deux fichiers de script: test1.php et test2.php tous deux présents dans la racine www. J'utilise buntu 12.04 LTS. La version de libcurl pour PHP est 7.22..

Contenu de test1.php

<?php
    $ch = curl_init();
    $post_data = array(
        'firstname' => 'John',
        'lastname' => 'Doe'
    );
    curl_setopt($ch, CURLOPT_URL, 'localhost/test2.php');
    curl_setopt($ch, CURLOPT_POST, TRUE);   //is it optional?
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_exec($ch);
    curl_close($ch);
?>

Contenu de test2.php

<?php 
    var_dump($_POST);
?>

Lorsque j'exécute test1.php via un navigateur, je peux voir les résultats publiés. Maintenant, si je supprime l'option curl contenant CURLOPT_POST, l'exemple fonctionne toujours. Même si j'ai défini CURLOPT_POST sur false, la publication est effectuée et le résultat est affiché. Alors, n'est-ce pas CURLOPT_POST pas du tout? Il ressemble à l'option CURLOPT_POSTFIELDS s'occupe de l'envoi des données via POST sans utiliser CURLOPT_POST option. Lorsque j'imprime $_SERVER dans test2.php, la méthode de demande est toujours définie sur POST (avec ou sans option CURLOPT_POST).

Quelqu'un pourrait-il me faire savoir l'utilisation exacte de CURLOPT_POST option? Est-il nécessaire pour envoyer des données via POST?

19
Sanjay Maurya

Vous avez raison. CURLOPT_POSTFIELDS implique CURLOPT_POST . Vous n'avez pas besoin d'utiliser CURLOPT_POST lorsque vous utilisez CURLOPT_POSTFIELDS . La méthode de demande sera toujours définie sur POST dans ce cas.

Notez que c'est dans votre cas tant que vous voulez que ce soit un [~ # ~] message [~ # ~]demande.

Si vous ne voulez pas que ce soit un [~ # ~] message [~ # ~] demande mais réglez CURLOPT_POSTFIELDS , veuillez consulter ces questions et réponses:

24
Niklesh_Chauhan

Pour référence future, le document API dit ceci à propos de CURLOPT_POST


Résumé:

Un vrai paramètre indique à la bibliothèque de faire une publication HTTP régulière. Cela permettra également à la bibliothèque d'utiliser l'en-tête "Content-Type: application/x-www-form-urlencoded". (C'est de loin la méthode la plus utilisée POST).

Utilisez l'option CURLOPT_POSTFIELDS pour spécifier les données à publier et CURLOPT_POSTFIELDSIZE pour définir la taille des données. Facultativement, vous pouvez fournir des données à POST à l'aide des options CURLOPT_READFUNCTION et CURLOPT_READDATA.

Vous pouvez remplacer l'en-tête par défaut POST Content-Type: en définissant le vôtre avec CURLOPT_HTTPHEADER.

L'utilisation de POST avec HTTP 1.1 implique l'utilisation d'un en-tête "Expect: 100-continue". Vous pouvez désactiver cet en-tête avec CURLOPT_HTTPHEADER comme d'habitude.

Si vous utilisez POST vers un serveur HTTP 1.1, vous pouvez envoyer des données sans connaître la taille avant de démarrer POST if vous utilisez un codage en blocs. Vous pouvez l'activer en ajoutant un en-tête comme "Transfer-Encoding: chunked" avec CURLOPT_HTTPHEADER. Avec HTTP 1.0 ou sans transfert en blocs, vous devez spécifier la taille dans la demande.

si vous avez émis une demande POST et que vous souhaitez effectuer une HEAD ou GET à la place, vous devez explicitement choisir la nouvelle type de demande utilisant CURLOPT_NOBODY ou CURLOPT_HTTPGET ou similaire.


Je teste en ce moment si la définition du CURLOPT_POST pour essayer remplacera mon paramètre CURLOPT_HTTPHEADER, "Content-Type: application/json; charset = utf-8".

0
mreinsmith