Things to note when using PHP curl function to send Post requests

墨辰丷
Release: 2023-03-28 13:32:02
Original
2703 people have browsed it

This article mainly introduces to you some precautions for using the curl function to send Post requests in PHP. The article introduces it in detail through sample codes and explanations. It has certain reference value for everyone to learn or use PHP. Friends who need it can follow the editor to learn.

Preface

I encountered a requirement at work a few days ago. When the user clicks a button, a post request is initiated in the background. Come to me, I accept the data passed over. At first, my colleague sent the message using the http_request() method publically encapsulated by the company framework. The code is as follows:


 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;
 }
Copy after login


At first I didn’t notice that the data passed was a json string encoded by application/json. I directly accepted the application/x-www-form-urlencoded encoding in the background. format data method to retrieve the passed data (that is, directly obtained using the $_POST method), the result is of course nothing and nothing is retrieved. Later, my colleague directly changed the http_request() method and directly passed the data in the application/x-www-form-urlencoded encoding format, so I didn’t make any changes.

Regarding the above question, I have always wondered why I didn’t get the data passed at that time.

The project is basically completed today, and the following has been studied.

##curl() function in php When making a post request, the format of passing data can be in the following ways:

(1 ):

key=>valuekey-value pair string formed by concatenating parameters. The form is as follows: name=xxx&age=23$sex=1

This request parameter is encoded according to

application/x-www-form-urlencoded by default .

(2):

key=>valuekey-value pair array composed of parameters (can only be a one-dimensional array, higher-dimensional arrays will report an error).

The format is as follows:


  [ name="xxx" , age = 23 , sex = 男 ]
Copy after login


##The request parameter defaults to

multipart/form- Encoded in data

format. As mentioned above,

curl()

When making a post request, only one-dimensional arrays can be passed as parameters. So what should be done if you want to pass multi-dimensional arrays?

There are two ways to deal with it, namely method 3 and method 4 below.

(3): Process the multi-dimensional array with

http_build_query()

and wait for a string in key=>value key-value pair format. As shown below:

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

##The following string will be obtained:

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
Copy after login


This method is also coded through
application/x-www-form-urlencoded. The receiver can pass $_POST Get it directly.

(4): Convert the multi-dimensional array into a string in json format, encode the string in application/json format, and pass

file_get_contents(“php:/ /input”)

or $GLOBALS['HTTP_RAW_POST_DATA'] to obtain the passed json format string, and then convert the json format string into an array for processing.

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



Note:

For application/json format The encoded data, $_POST cannot be obtained directly, it needs to be obtained through file_get_contents("php://input") or $GLOBALS['HTTP_RAW_POST_DATA'] way to obtain. The above is the entire content of this article, I hope it will be helpful to everyone's study.

Related recommendations:


php

Implementation method of loop traversal of one-dimensional array

How PHP and MYSQL implement paging navigation ideas

##php
array_reverse Detailed explanation of returning an array in reverse order


The above is the detailed content of Things to note when using PHP curl function to send Post requests. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!