115 votes

curl format POST pour CURLOPT_POSTFIELDS

Lorsque j'utilise curl via POST et que je définis CURLOPT_POSTFIELD dois-je urlencode ou un format spécial?

par exemple: Si je veux poster 2 champs, premier et dernier:

 first=John&last=Smith
 

Quel est le code / format exact à utiliser avec curl?

 $ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
 

106voto

kodeart Points 807

Si vous envoyez une chaîne, urlencode () la. Sinon, si array, ce devrait être la clé => valeur appariée et l'en-tête Content-type est automatiquement défini sur multipart/form-data .

De plus, vous n'avez pas besoin de créer des fonctions supplémentaires pour construire la requête pour vos tableaux, vous avez déjà cela:

 $query = http_build_query($data, '', '&');
 

69voto

Czechnology Points 8031

À partir du manuel:

CURLOPT_POSTFIELDS

Les données complètes de post en HTTP "POST" de l'opération. Pour poster un fichier, ajouter un nom de fichier avec @ et utiliser le chemin d'accès complet. Le type de fichier peut être spécifié explicitement par la suite le nom de fichier avec le type dans le format ';type=type mime'. Ce paramètre peut être passé comme un urlencoded chaînes comme "para1=val1&para2=val2&..." ou comme un tableau avec le nom du champ comme clé et le champ données de la valeur. Si la valeur est un tableau, le header Content-Type sera défini comme " multipart/form-data. Depuis PHP 5.2.0, les fichiers c'est passé à cette option avec le préfixe " @ " doit être dans la gamme forme de travail.

Donc, quelque chose comme cela devrait fonctionner parfaitement (avec les paramètres passés dans un tableau associatif):

function preparePostFields($array) {
  $params = array();

  foreach ($array as $key => $value) {
    $params[] = $key . '=' . urlencode($value);
  }

  return implode('&', $params);
}

42voto

ThiefMaster Points 135805

Ne passez pas une ficelle du tout!

Vous pouvez passer un tableau et laisser php / curl faire le sale travail d’encodage, etc.

6voto

Surreal Dreams Points 12016

Selon le manuel PHP, les données transmises à cURL en tant que chaîne doivent être encodées en URL. Voir la page pour curl_setopt () et recherchez CURLOPT_POSTFIELDS .

-3voto

user2512571 Points 11

Cette réponse m'a pris pour toujours à trouver aussi. J'ai découvert que tout ce que vous avez à faire est de concaténer l'URL ('?' Après le nom du fichier et son extension) avec la chaîne de requête codée par l'URL. Il ne semble même pas que vous deviez définir les options POST cURL. Voir le faux exemple ci-dessous:

 //create URL
$exampleURL = 'http://www.example.com/example.php?';

// create curl resource
$ch = curl_init(); 

// build URL-encoded query string
$data = http_build_query(
    array('first' => 'John', 'last' => 'Smith', '&'); // set url
curl_setopt($ch, CURLOPT_URL, $exampleURL . $data); 

// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// $output contains the output string
$output = curl_exec($ch); 

// close curl resource to free up system resources <br/>
curl_close($ch);
 

Vous pouvez également utiliser file_get_contents() :

 // read entire webpage file into a string
$output = file_get_contents($exampleURL . $data);
 

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