PHP 中的 curl 函数发送 Post 请求应该注意的几点
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;
}
一开始我并没有留意传递过来的数据是application/json编码的json字符串,我在后台直接用接受application/x-www-form-urlencoded编码格式的数据方式来取传递过来的数据(就是直接用的$_POST方式获取的),结果当然没什么也没有取到了。后来,同事直接改了http_request()方法,直接传递application/x-www-form-urlencoded编码格式的数据过来,我这就没有做更改。
对于上面的问题,我一直纳闷当时为什么没有拿到传递过来的数据。今天项目基本完工,研究了以下。
<pphp中的curl()函数进行post请求的时候,传递数据的格式可以有以下几种方式:
(1):由参数拼接而成的key=>value键值对字符串。形如以下: name=xxx&age=23$sex=1
这种请求参数默认是按照application/x-www-form-urlencoded进行编码的。
(2):由参数组成的key=>value键值对数组(只能是一维数组,更高维度的数组会报错)。形如以下格式:
[ name="xxx" , age = 23 , sex = 男 ]
这种请求参数默认是按照multipart/form-data格式进行编码的。
上面说了,curl()进行post请求的时候,只能传递一维数组作为传递的参数,那么如果想要传递多维数组需要怎么处理那?有两种方式可以来处理,分别是下面的方式3以及方式4。
(3):将多维数组进行http_build_query()进行处理,等到一个key=>value键值对格式的字符串。如下面所示:
$data = [ "msg"=>"这是一条测试数据", "xxx" => "yyyy", "msg_data" => [ "name"=>"sunms", "age"=>23, "sex"=>"男", "content"=>[ 1,2,3 ] ], ];
将得到以下的字符串:
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
这种方式也是通过application/x-www-form-urlencoded进行编码的,在接收方可以通过$_POST直接获取。
(4):将多维数组转换为json格式的字符串,对字符串进行application/json格式编码,在接收方通过file_get_contents(“php://input”)或者$GLOBALS[‘HTTP_RAW_POST_DATA’]的方式获取传递过来的json格式的字符串,然后将json格式的字符串转换为数组进行处理。 $data = [];
$data_string = json_encode($data);
.....
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string))); 注意:对于application/json格式编码的数据,$_POST是不能直接获取的,需要通过file_get_contents(“php://input”)或者$GLOBALS[‘HTTP_RAW_POST_DATA’]的方式获取。
For this tutorial, I am going to go through how to setup your development and production server environments properly for PHP development.
Development environment windows
Without having to install a Windows server, which is quite costly, you can install one of the several third-party applications to which will get your server environment up for you.
Some of these applications are XAMPP and WAMP. And all these third-party applications do the same thing―install Apache, MySQL, and PHP inside the program.
XAMPP is my personal favorite ― which you can download at www.apachefriends.org ― as it is cross-platform. XAMPP stands for cross-platform, Apache, MariaDB, PHP,Perl. When installing XAMPP, it is very straight forward (and just in case you need to know, you can install Laravel with XAMP ) . Just keep hitting next and agree to everything. However, for the development environment ,you need to install the development tools which just changes the php.ini file to allow errors message display. If error messages are not displayed, go to c:xampp/php/ and open the php.ini file, and make sure that everything under error handling and logging (line 463) has been turned on, then restart your Apache server.