Maison >développement back-end >tutoriel php >Choses à noter lors de l'utilisation de la fonction PHP curl pour envoyer des requêtes Post

Choses à noter lors de l'utilisation de la fonction PHP curl pour envoyer des requêtes Post

墨辰丷
墨辰丷original
2018-05-30 14:06:582800parcourir

Cet article vous présente principalement quelques précautions pour utiliser la fonction curl pour envoyer des requêtes Post en PHP. L'article le présente en détail à travers des exemples de codes et des explications. Il a une certaine valeur de référence pour que tous ceux qui apprennent ou utilisent PHP. en avez besoin, vous pouvez suivre l'éditeur pour apprendre.

Préface

Il y a quelques jours, j'ai rencontré une exigence au travail Lorsque l'utilisateur clique sur un bouton, une demande de publication est initiée dans. l'arrière-plan. Venez à moi, j'accepte les données transmises. Au début, les collègues utilisaient la méthode d'encapsulation publique du framework de l'entreprise http_request() pour envoyer, le code est le suivant :


 public function http_request( $url, $post = '', $timeout = 5 ){ 
 if( empty( $url ) ){
  return ;
 }
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 
 if( $post != '' && !empty( $post ) ){
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($post)));
 }
 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 $result = curl_exec($ch);
 curl_close($ch);
 return $result;
 }


Au début, je n'ai pas remarqué que les données transmises étaient une chaîne json codée application/json J'ai directement utilisé la méthode d'acceptation des données codées application/x-www-form-urlencoded en arrière-plan pour obtenir les données transmises (c'est-à-dire directement en utilisant le <.> méthode pour l'obtenir) , et bien sûr rien n'a été obtenu. Plus tard, mon collègue a directement changé la méthode $_POST et a directement transmis les données au format d'encodage http_request(). Je n'ai apporté aucune modification. application/x-www-form-urlencoded

Concernant la question ci-dessus, je me suis toujours demandé pourquoi je n'avais pas transmis les données à ce moment-là.

Aujourd'hui, le projet est pratiquement terminé et les éléments suivants ont été étudiés.

Lorsque la fonction

en PHP fait une requête de publication, le format des données peut être transmis des manières suivantes : curl()

(1) : épissé ​​par paramètres dans une chaîne de

paires clé-valeur. La forme est la suivante : key=>valuename=xxx&age=23$sex=1

Ce type de paramètre de requête est codé selon

par défaut. application/x-www-form-urlencoded

(2) :

tableau de paires clé-valeur composé de paramètres (ne peut être qu'un tableau unidimensionnel, les tableaux de dimension supérieure signaleront une erreur). key=>value

est au format suivant :


  [ name="xxx" , age = 23 , sex = 男 ]


Ce paramètre de requête est par défaut au format

Codé . multipart/form-data

Comme mentionné ci-dessus,

lors d'une demande de publication, seuls les tableaux unidimensionnels peuvent être transmis en tant que paramètres. Alors, que faut-il faire si vous souhaitez transmettre des tableaux multidimensionnels ? curl()

Il existe deux façons de résoudre ce problème, à savoir la méthode 3 et la méthode 4 ci-dessous.

(3) : Traitez le tableau multidimensionnel avec

et attendez une chaîne au format key=>value. http_build_query()

comme indiqué ci-dessous :


$data = [
          "msg"=>"这是一条测试数据",
          "xxx" => "yyyy",
          "msg_data" => [
                          "name"=>"sunms",
                          "age"=>23,
                          "sex"=>"男",
                          "content"=>[
                                 1,2,3
                                ]
                       ],
       ];


obtiendra la chaîne suivante :


msg=这是一条测试数据&xxx=yyyy&msg_data[name]=sunms&msg_data[age]=23&msg_data[sex]=男&msg_data[content][0]=1&msg_data[content][1]=2&msg_data[content][2]=3


Cette méthode est également codée via la ligne

et peut être obtenue directement via $_POST chez le récepteur. application/x-www-form-urlencoded进

(4) : Convertissez le tableau multidimensionnel en une chaîne au format json, encodez la chaîne au format

et obtenez le format json transmis via application/json ou file_get_contents(“php://input”) au niveau de la chaîne du récepteur , puis convertissez la chaîne au format json en un tableau pour le traitement. $GLOBALS[‘HTTP_RAW_POST_DATA']


$data = [];
$data_string = json_encode($data);
.....
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
               &#39;Content-Type: application/json&#39;,
               &#39;Content-Length: &#39; . strlen($data_string))
      );


Remarque : Pour les données codées au format , application/json ne peut pas être obtenu directement, il doit être obtenu via $_POST ou file_get_contents(“php://input”). $GLOBALS[‘HTTP_RAW_POST_DATA']

Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.


Recommandations associées :

php Méthode de mise en œuvre du parcours en boucle d'un tableau unidimensionnel

Comment PHP et MYSQL implémentent les idées de navigation par pagination

php array_reverse Explication détaillée du renvoi des tableaux dans l'ordre inverse

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en 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