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&…' 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 !