Maison >php教程 >PHP开发 >Détails d'utilisation du paramètre CURLOPT_POSTFIELDS de CURL en PHP

Détails d'utilisation du paramètre CURLOPT_POSTFIELDS de CURL en PHP

高洛峰
高洛峰original
2016-12-23 15:18:351314parcourir

Dans des circonstances normales, lorsque nous utilisons CURL pour soumettre des données POST, nous avons l'habitude de les écrire comme ceci :

curl_setopt( $ch, CURLOPT_POSTFIELDS,$post_data);

Mais cette méthode d'écriture n'est pas très utile parfois, peut-être que vous obtiendrez un 500 erreur renvoyée par le serveur. Mais lorsque nous essayons de soumettre des données au serveur à l'aide de Socket, nous obtenons des résultats très corrects.
Par exemple, nous avons le fichier PHP suivant sur le serveur :

<?php print_r($_SERVER);?>

Lorsque nous utilisons CURL pour envoyer des données au serveur sans prêter attention aux détails, nous pouvons obtenir les résultats suivants, qui Ce n'est pas notre résultat idéal :

[CONTENT_TYPE] => multipart/form-data; boundary=—————————-f924413ea122

Mais si nous utilisons http_build_query($post_data) au lieu de $post_data et soumettons ensuite des données à ce script PHP, nous obtiendrons des résultats différents de ceux ci-dessus. C'est notre résultat idéal. :

[CONTENT_TYPE] => application/x-www-form-urlencoded

Il n'est pas difficile de voir à partir de l'exemple ci-dessus que lors de l'utilisation de CURL et que le paramètre est data, lors de la soumission des données au serveur, l'en-tête HTTP enverra Content_type: application/ x-www- formulaire-urlencodé. Il s'agit de l'en-tête envoyé par le navigateur lors de la soumission du formulaire sur une page Web normale ff9c23ada1bcecdd1a0fb5d5a0f18437. Et multipart/form-data, nous savons que c'est le formulaire utilisé pour télécharger des fichiers. L'inclusion du délimiteur de limite ajoutera de nombreux octets.
Le manuel officiel dit ceci :

The full data to post in a HTTP “POST” operation. To post a file, prepend a filename with @ and use the full path. This can either be passed as a urlencoded string like ‘para1=val1¶2=val2&…&#39; or as an array with the field name as key and field data as value. If value is an array, the Content-Type header will be set to multipart/form-data.

Lors de l'utilisation d'un tableau pour fournir des données de publication, le composant CURL doit probablement être compatible avec la méthode d'écriture @filename pour télécharger des fichiers. Par défaut, le type de contenu. est défini sur multipart/form-data. Bien que cela n’ait aucun impact sur la plupart des serveurs, certains serveurs sont néanmoins incompatibles.
Après quelques résumés, nous sommes finalement arrivés à la conclusion : lorsqu'il n'est pas nécessaire de télécharger des fichiers, essayez d'effectuer un traitement http_build_query sur les données soumises par courrier, puis envoyez-les, ce qui peut obtenir une meilleure compatibilité et des données de requête plus petites. paquets.


Pour plus de détails sur l'utilisation des paramètres CURLOPT_POSTFIELDS de CURL en PHP, veuillez faire attention au site PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn